代码之家  ›  专栏  ›  技术社区  ›  Luiz

使用映射表保持一致性的最佳方法

  •  1
  • Luiz  · 技术社区  · 6 年前

    我有一个PostgreSQL数据库,有一个名为 TIRE 在这里我保存了一些关于轮胎的信息,另一个名为 VEHICLE 是放置所有车辆信息的地方。

    我还需要绘制什么轮胎与什么车辆相关,在什么位置。 我有一张桌子叫 VEHICLE_TIRE .

    以下是表格的结构(简化为仅涵盖我的问题):

    轮胎:

    ID | GARAGE_ID
    

    车辆:

    ID | PLATE_NUMBER | GARAGE_ID
    

    车辆轮胎

    VEHICLE_ID | TIRE_ID | TIRE_POSITION
    

    每一位客户都有多个车库,他的车辆就在那里。他们需要知道他们的轮胎和车辆在哪个车库。这是由 GARAGE_ID 列。轮胎不必与车辆相关(在 车辆轮胎 )因为它可能是特别车库的备胎。

    在任何时候,客户都可以在系统中的车库之间转移车辆和轮胎。当然,如果他转让一辆车,他所有相关的轮胎也必须转让。客户还可以将轮胎从车辆上拆下,仅传送此特定轮胎。

    我的问题是,我如何确保,在数据库级别,轮胎与车辆总是在同一个车库,并防止一个轮胎在一个车库和车辆在另一个车库(不同的车库ID)的状态。

    唯一的解决方案是在两个表中都使用触发器, 车辆 轮胎 ,以确保在每次更新中不会发生这种不一致。

    另一个需要考虑的是 车辆 轮胎 表是为所有客户机共享的巨大表,并且更新频繁,所以我担心我的解决方案会增加的开销。

    我能用另一种方法达到同样的目的吗?

    编辑:

    SQL Fiddle 使用唯一约束的解决方案。

    这样的更新被阻止: UPDATE VEHICLE_TIRE SET VEHICLE_ID = 2 WHERE VEHICLE_ID = 1

    1 回复  |  直到 6 年前
        1
  •  1
  •   Laurenz Albe    6 年前

    我想补充一下 garage_id vehicle_tire 到的主键 tire vehicle (或添加新的唯一约束)。

    然后你可以添加 车库ID 给外挂钥匙,你的问题应该解决。