我有一个分层table
个地理位置,通过parent/child
和foreign key
强制self join
关系。
location
有一个LocationTypeID
,表示它的位置。
只能将某人分配到特定位置。例如,Office工作人员可能具有LocationID
foreign keys
到此位置表。但是他只能被分配到LocationTypeID
与ID 6(即Office)相关的位置。他无法被分配到任何其他ID,例如将他分配到建筑物。
有没有办法从数据库级别强制这种关系?也许唯一的选择是check constraint
和Insert/Update
的{{1}} Location table
?
答案 0 :(得分:0)
也许您对数据库设计进行了过度优化。如果办公室工作人员只能与办公室挂钩,为什么要将他与一些模糊的“位置”联系起来,而不是办公室?
你说你的位置表是分层的,所以你有像'country'这样的东西 - > 'city' - > 'street' - > '建筑' - > “办公室”或“公寓”或“购物”,您希望您的官员仅与办公室联系。
一种解决方案是提供办公桌。您将所有办公室位置ID放在此处(但您仍然无法保证不会错误地插入“城市”记录)。但如果此表 正确,您可以将您的官员链接到链接到位置表的办公室,这样您就永远无法将官员链接到非办公室。
另一个选项涉及组合键。例如(主键粗体):
1, 'officer'
100, 'office'
1, 100
链接官员和办公室位置的键现在是数字加类型,因此您需要两个来解决表中的记录。与由数字和类型标识的人相同。因此,在person_location表中,您需要位置编号和类型以及人员编号和类型来链接人员和位置。您对location,person和person_type_location_type有外键约束,后者保证您只能将官员链接到办公室。
(组合密钥优于单个密钥,即使在多个级别上也能保证数据的一致性。但它也需要一些思考才能获得正确的表格设计。)