基于行保持参照完整性

时间:2016-02-09 04:13:11

标签: sql sql-server

我有一个分层table个地理位置,通过parent/childforeign key强制self join关系。

location有一个LocationTypeID,表示它的位置。

只能将某人分配到特定位置。例如,Office工作人员可能具有LocationID foreign keys到此位置表。但是他只能被分配到LocationTypeID与ID 6(即Office)相关的位置。他无法被分配到任何其他ID,例如将他分配到建筑物。

有没有办法从数据库级别强制这种关系?也许唯一的选择是check constraintInsert/Update的{​​{1}} Location table

1 个答案:

答案 0 :(得分:0)

也许您对数据库设计进行了过度优化。如果办公室工作人员只能与办公室挂钩,为什么要将他与一些模糊的“位置”联系起来,而不是办公室?

你说你的位置表是分层的,所以你有像'country'这样的东西 - > 'city' - > 'street' - > '建筑' - > “办公室”或“公寓”或“购物”,您希望您的官员仅与办公室联系。

一种解决方案是提供办公桌。您将所有办公室位置ID放在此处(但您仍然无法保证不会错误地插入“城市”记录)。但如果此表 正确,您可以将您的官员链接到链接到位置表的办公室,这样您就永远无法将官员链接到非办公室。

另一个选项涉及组合键。例如(主键粗体):

  • person_type( person_type_no ,说明),例如:1, 'officer'
  • location_type( location_type_no ,说明),例如100, 'office'
  • person_type_location_type( person_type_no location_type_no ),例如1, 100链接官员和办公室
  • 位置( location_type_no,location_no ,parent_location_type_no,parent_location_no,...)
  • person( person_type_no,person_no ,姓名,......)
  • person_location( person_type_no,person_no,location_type_no,location_no

位置的键现在是数字加类型,因此您需要两个来解决表中的记录。与由数字和类型标识的人相同。因此,在person_location表中,您需要位置编号和类型以及人员编号和类型来链接人员和位置。您对location,person和person_type_location_type有外键约束,后者保证您只能将官员链接到办公室。

(组合密钥优于单个密钥,即使在多个级别上也能保证数据的一致性。但它也需要一些思考才能获得正确的表格设计。)