Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于行维护引用完整性_Sql_Sql Server - Fatal编程技术网

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
    链接官员和办公室
  • 位置(位置类型编号、位置编号、父位置类型编号、父位置编号……)
  • 人员(人员类型编号、人员编号、姓名等)
  • 人员位置(人员类型编号、人员编号、位置类型编号、位置编号
一个位置的键现在是数字加类型,因此您需要这两个键来寻址表中的一条记录。与通过数字和类型识别的人相同。因此,在person_location表中,您需要location number和type以及person number和type来链接person和location。您将对位置、人员和人员类型进行外键约束,后者保证您只能将官员链接到办公室


(与单个键相比,组合键的最大优点是即使在多个级别上也能保证数据的一致性。但它还涉及到一些思考,以获得正确的表设计。)

为什么在其他表中需要LocationTypeID?如果每个位置都有一个LocationTypeID,那么它将是一个派生字段,并且在其他表中具有LocationTypeID将是多余的。LocationTypeID仅在位置表中。LocationID位于Staff表中,并且只应与LocationTypeID=x的Location表中的LocationID相关。只有一个LocationTypeID。据我所知,您不能在外键约束上指定这种类型的条件。最好的选择是使用检查约束。