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

时间:2018-05-27 22:08:22

标签: database postgresql

我有一个名为VEHICLE的表的PostgreSQL数据库,其中我保存了一些关于轮胎的信息,另一个名为VEHICLE_TIRE的表,并且是放置所有车辆信息的地方。

我还需要绘制哪些轮胎与哪种车辆以及在什么位置相关联。 为了覆盖那个场景,我有一个名为ID | GARAGE_ID 的表。

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

TIRE:

ID | PLATE_NUMBER | GARAGE_ID

车辆:

VEHICLE_ID | TIRE_ID | TIRE_POSITION

VEHICLE_TIRE

GARAGE_ID

每个客户都有多个停放车辆的车库。他们需要知道他们的轮胎和车辆在哪个车库。这由VEHICLE_TIRE列涵盖。轮胎不一定与车辆相关联(VEHICLE中没有该轮胎的入口),因为它可能是特定车库的轮胎。

在任何时候,客户都可以在车库中将车辆和轮胎转移到系统中。当然,如果他转移车辆,他的所有相关轮胎也必须转移。客户还能够将轮胎与车辆分离并仅转移该特定轮胎。

我的问题是,如何在数据库级别确保与车辆相关的轮胎始终位于同一车库并防止轮胎位于一个车库并且车辆位于另一个车库(不同车库)中的状态

我遇到的唯一解决方案是在两个表TIREVEHICLE中使用触发器,以确保在每次UPDATE中都不会发生这种不一致。

要考虑的另一件事是TIREUPDATE VEHICLE_TIRE SET VEHICLE_ID = 2 WHERE VEHICLE_ID = 1表是为所有客户端共享的大表,并且经常更新,所以我担心我的解决方案会增加的开销。

我可以使用其他方法达到同样的目的吗?

编辑:

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

此类更新被屏蔽:function getUserDetail($user_id) { $this->db->select('*'); $this->db->from('tbl_loggedin_user'); $this->db->where('user_id', $user_id); return $this->db->get()->result_array(); }

1 个答案:

答案 0 :(得分:1)

我会将garage_id添加到vehicle_tire,将garage_id添加到tirevehicle的主键(或添加新的唯一约束)。< / p>

然后您可以将garage_id添加到外键,您的问题应该得到解决。