我创建了一个数据库,以ACID方法存储数据点。一个表本身保存数据点,并具有指向数据源的外键。每个地理位置有多个来源,因此我为这些位置提供了另一个表格。从数据源中,我对这些位置有一个外键,一切都很好。
现在,我的老板要求我在传感器数据中创建一个新列,以便也链接到该位置,以简化调试和提高性能。但是我仍然希望数据库检查是否无法为特定数据源以及该源和该位置不匹配的位置插入一个数据点。
如果数据库根据提供的sourceid自动生成位置ID,那就更好了。
数据:
ID | SrcID | LocID | MoreColumns
---+-------+-------+------------
1 | 1 | 1 | X - OK
2 | 1 | 2 | X - Bad, DataSource is not at location 2
3 | 4 | 4 | X - Bad, Location 4 doesn't exist, but is caught by FK-Constraints
源代码:
ID | LocID | MoreColumns
---+-------+------------
1 | 1 | X
2 | 1 | X
3 | 2 | X
查找:
ID | MoreColumns
---+------------
1 | X
2 | X
如何在这里实现数据一致性?
使用FK可以检查Loc和Src是否存在,但是如何确保数据指向的位置与源指向的位置相同?
答案 0 :(得分:0)
我通过使Src中的主键成为复合主键(ID, LocID)
,然后从数据(SrcID, LocID)
到Src (ID, LocID)
中的主键解决了这个问题。 br />
为了确保仅为Src分配唯一的ID
,我在Src的ID
上创建了另一个唯一索引。
从Src到Loc的外键保持不变。