Sql 基于行维护引用完整性
我有一个位置的分层Sql 基于行维护引用完整性,sql,sql-server,Sql,Sql Server,我有一个位置的分层表,通过外键和自连接强制建立父/子关系 location有一个LocationTypeID,指示它是什么类型的位置 只能将人员分配到特定位置。例如,一个办公室工作人员可能有一个LocationID,它将外键添加到此位置表。但他只能被分配到LocationTypeID与ID 6(办公室)相关的位置。不能将他分配给任何其他ID,例如分配给建筑物 有没有办法从数据库级别强制建立这种关系?可能唯一的选择是对位置表和人员表的插入/更新进行检查约束?可能您过度优化了数据库设计。如果一个办公
表
,通过外键
和自连接
强制建立父/子关系
location
有一个LocationTypeID
,指示它是什么类型的位置
只能将人员分配到特定位置。例如,一个办公室工作人员可能有一个LocationID
,它将外键
添加到此位置表。但他只能被分配到LocationTypeID
与ID 6(办公室)相关的位置。不能将他分配给任何其他ID,例如分配给建筑物
有没有办法从数据库级别强制建立这种关系?可能唯一的选择是对
位置表
和人员表
的插入/更新
进行检查约束
?可能您过度优化了数据库设计。如果一个办公室职员只能链接到一个办公室,为什么你把他链接到一个模糊的“位置”,而没有一张办公桌
你说你的位置表是分级的,所以你有一些像“国家”->“城市”->“街道”->“建筑”->“办公室”或“公寓”或“商店”,你希望你的官员只链接到一个办公室
一个解决方案是提供一张办公桌。您可以将所有办公地点ID都放在这里(但仍然不能保证没有错误插入“城市”记录)。但是如果这个表是正确的,您可以将您的官员链接到链接到位置表的办公室,因此您永远不能将官员链接到非办公室
另一个选项涉及组合键。例如(主键粗体):
- 人员类型(人员类型编号,描述),例如:
1,“官员”
- 位置类型(位置类型编号,说明),例如
100,“办公室”
- 人员类型位置类型(人员类型编号,位置类型编号),例如
链接官员和办公室1100
- 位置(位置类型编号、位置编号、父位置类型编号、父位置编号……)
- 人员(人员类型编号、人员编号、姓名等)
- 人员位置(人员类型编号、人员编号、位置类型编号、位置编号)
(与单个键相比,组合键的最大优点是即使在多个级别上也能保证数据的一致性。但它还涉及到一些思考,以获得正确的表设计。)为什么在其他表中需要LocationTypeID?如果每个位置都有一个LocationTypeID,那么它将是一个派生字段,并且在其他表中具有LocationTypeID将是多余的。LocationTypeID仅在位置表中。LocationID位于Staff表中,并且只应与LocationTypeID=x的Location表中的LocationID相关。只有一个LocationTypeID。据我所知,您不能在外键约束上指定这种类型的条件。最好的选择是使用检查约束。