每次将新行条目添加到available_seats
表
FLIGHT
表中的值FLIGHT_PLAN
FLIGHT_PLAN
定义为:
FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
和FLIGHT
定义为
FLIGHT (flight_number NUMBER, available_seats NUMBER)
我应该使用存储过程,触发器吗?
答案 0 :(得分:5)
如果这样做,您将在DB中多次存储相同的数据,这是一种优化。您确定需要优化吗?
如果您这样做,请查找触发器。您可能希望在创建,更新和删除FLIGHT_PLAN表时触发以调整FLIGHT表。
如果您不需要优化,或者您还不确定是否需要优化,请不要进行优化。您可以快速查询已分配席位的数量,并从中计算出您想要的remaining_seats值:
SELECT FLUNT(*)FROM FLIGHT_PLAN,其中PLAN_NUMBER =?
SELECT total_seats FROM FLIGHT;
...
$ available_seats - $ total_seats - $ occupied_seats;
答案 1 :(得分:3)
我将在存储过程中处理整个过程。更容易阅读和管理必要的锁定(即确保当A人在与B人完全相同的时间添加飞行计划时,您不会获得负面可用座位。)
答案 2 :(得分:2)
结合您的其他问题here我建议您保持数据的标准化。
FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
FLIGHT (flight_number NUMBER, model_id NUMBER)
PLANE_MODEL(NUMBER model_id, NUMBER capacity)
将model_id添加到FLIGHT中,这将为您提供通过联接的航班容量。要了解可用的座位数,您可以使用查询:
SELECT F.flight_number, M.capacity, M.capacity - COALESCE((
SELECT count(*) FROM FLIGHT_PLAN P
WHERE P.flight_number = F.flight_number
), 0) as AvailableSeats
FROM FLIGHT F
INNER JOIN PLANE_MODEL M ON M.model_id=F.model_id
答案 3 :(得分:0)
我更喜欢SQL proc,即增量 和减少(毫无疑问其他 数据)在单个交易中。
使用FLIGHT_PLAN上的触发器可以解决它。以下检查使其成为现实:
Alter Table FLIGHT Add
Constraint FLIGHT_AVAIL_SEATS_CHK
Check (available_seats >= 0);