关联两个分层自引用表

时间:2018-02-08 22:15:35

标签: sql-server database-design sql-server-2012 schema database-schema

我有一个自引用表,它表示属性的分层树。树中可以有多个根(或多个树,但是你想要考虑它):

enter image description here

该表允许我创建层次结构的定义,例如:

enter image description here

现在,我需要为给定的用户捕获树中属性的值。用户可以拥有多组属性值,每个属性祖先也可以有多组值:

enter image description here

该表允许我为层次结构中的属性赋值,其中每个属性及其祖先可以有多个实例:

enter image description here

如此有效,我现在有两个自引用表。一个是属性层次结构的定义,另一个是值的层次结构。值层次结构与定义层次结构和特定用户相关。

我的问题是参照完整性。

如何根据属性层次结构强制UserAttribute记录与正确的父UserAttribute相关。如果我将属性B作为A的父级,我就不能创建与属性B相关的UserAttribute,后者是与属性C相关的UserAttribute的父级。

最初我以为我会:

  • 根据属性表创建复合主键 AttributeID和ParentAttributeID。
  • 根据UserAttributeID和AttributeID
  • 在UserAttribute表上创建复合主键
  • 使用复合键
  • 在UserAttribute表上创建自引用
  • 使用复合主键
  • 将UserAttribute表关联到属性表

问题是Attribute表中的根记录具有null ParentAttributeID,UserAttribute表中的根记录具有null ParentUserAttributeID,并且复合键中的列不能具有空值,因此将kybosh放在该计划上。 / p>

是否有某种方法可以实现对完全不同的架构或对现有架构的轻微调整?也许我没有对此进行适当的建模。

1 个答案:

答案 0 :(得分:0)

您已在Attribute跟踪属性的父级,因此请勿跟踪UserAttributeValue中的父级UserAttributeValueUserAttributeValue仅包含有关指定属性的用户值的信息,并导航Attribute侧的树。

另外,如果每个用户每个属性只能有一个值,您也可以删除列UserAttributeID,而是使用UserID, AttributeID的复合键。