【问题标题】:SQL: negative autoincrement?SQL:负自动增量?
【发布时间】:2011-06-10 04:51:11
【问题描述】:

每次向FLIGHT_PLAN 表添加新行条目时,我想自动减小FLIGHT 表中的值available_seats

FLIGHT_PLAN 定义为:

FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)

FLIGHT被定义为

FLIGHT (flight_number NUMBER, available_seats NUMBER) 

我应该使用存储过程、触发器吗?

【问题讨论】:

    标签: sql database oracle stored-procedures triggers


    【解决方案1】:

    如果这样做,您将在数据库中多次存储相同的数据,这是一种优化。您确定需要优化吗?

    • 如果您这样做,请查找触发器。您可能希望在创建、更新和删除 FLIGHT_PLAN 表时触发以调整 FLIGHT 表。

    • 如果您不需要优化或不确定是否需要优化,请不要进行优化。您可以快速查询已分配座位的数量,并从中计算出您想要的剩余座位值:

      从 FLIGHT_PLAN 中选择 COUNT(*),其中 PLAN_NUMBER = ?

      从航班中选择 total_seats;

      ...

      $available_seats - $total_seats - $occupied_seats;

    【讨论】:

    • "您确定需要优化吗?" -- 很好,但我更喜欢 SQL 过程,即在单个事务中递增和递减(无疑还有其他数据)。
    • 支持规范化的一个强有力的论据是并发性:如果同一个航班被两个并行进程修改,非规范化的座位数很容易变得不正确。防止这种情况的唯一方法是序列化事务,这会影响可伸缩性。正如@ijw 和@cyberkiwi 所建议的,规范化的方法消除了对序列化的需求并确保派生值始终正确。
    【解决方案2】:

    我会在一个存储过程中处理整个过程。更容易阅读和管理必要的锁定(即确保当 A 与 B 完全相同的时间添加飞行计划时,您不会得到负的可用座位)。

    【讨论】:

      【解决方案3】:

      结合您的其他问题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
      

      【讨论】:

      • +1 尽管这是一个相互竞争的答案,但因为您已从另一个问题中合并了 PLANE_MODEL。
      【解决方案4】:

      我更喜欢 SQL 过程,即增量 和递减(毫无疑问还有其他 数据)在单个事务中。

      使用 FLIGHT_PLAN 上的触发器,您可以解决它。下面的检查使它变得圆润:

      Alter Table FLIGHT Add
        Constraint FLIGHT_AVAIL_SEATS_CHK
        Check (available_seats >= 0);
      

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 2021-01-07
        • 1970-01-01
        • 2013-07-12
        • 2018-07-04
        • 2020-11-16
        • 2013-11-07
        • 2015-12-30
        • 1970-01-01
        相关资源
        最近更新 更多