Sql 同一表列需要两个外键条件

Sql 同一表列需要两个外键条件,sql,sql-server,database,foreign-key-relationship,Sql,Sql Server,Database,Foreign Key Relationship,我附上了我的旧数据库的简单图表 在这个设计中 由表TP表示的两个表T和P之间存在多对多关系 关系表TP与表D 现在,需求有了一些变化,T本身可能有许多(D) 如何在旧外键条件(TP到D)的基础上,在表D中创建这些新外键条件 我的意思是,除了将TP.[T,p]链接到D.[T]之外,还可以将T.[Id]链接到D.[T,p] 如何解决我的新需求?是的,您可以将表T中的外键引用放入表D中。它将是一对多关系,就像表T到表TP的关系一样 我不明白为什么你想在表D中有一个表T的FK引用。目前,您可以将T连

我附上了我的旧数据库的简单图表

在这个设计中

  • 由表TP表示的两个表TP之间存在多对多关系
  • 关系表TP与表D
现在,需求有了一些变化,T本身可能有许多(D

如何在旧外键条件(TPD)的基础上,在表D中创建这些新外键条件

我的意思是,除了将TP.[T,p]链接到D.[T]之外,还可以将T.[Id]链接到D.[T,p]


如何解决我的新需求?

是的,您可以将表T中的外键引用放入表D中。它将是一对多关系,就像表T到表TP的关系一样


我不明白为什么你想在表D中有一个表T的FK引用。目前,您可以将T连接到TP到D,以获得表D中与表T中的行相关的行。

这似乎很简单。只需在D中添加一个新列链接到T。请注意,如果我做对了,D[T,P]中的T可能与D[T]中的T不同。

我通过以下方法解决了这个问题:

  • 使D[T]可为空
  • 将新外键约束添加到表DT.[Id]D.[T]
现在,

如果在D表中插入新行,使p分量值设置为NULL,则只会检查将T约束为D


如果新行将其p组件设置为value defer fromNULL,则将检查两个约束T到DTP到D

如果我刚刚将T添加到D关系。然后,将新行插入到D可能会破坏TP到D的条件。这是错误的吗?@Lio-是的,这是正确的,但这也会破坏您现在的DB表设计,就像您要添加T到D的关系一样。如果你在D中放一个新行,你会破坏当前的TP-to-D关系以及我建议的额外FK关系。如果我只是将D[P]设为null,你会怎么想?这有意义吗?我这么说是因为SQLServer似乎接受了它。我现在很困惑。@Lio-你可以将FK引用设为null,这很有意义……如果T中的一行在D中可能没有对应的行,并且T和TP之间的FK引用可以为null。谢谢@GWines,我添加了一个答案,希望它能给出一些想法。这意味着我不能对这两个关系使用相同的D列[T]。是吗?因为它们可能是(可能)两个不同的T,实际上在同一个D中。把TP看作是另一个实体。想象你的图表就像两个关系:到T和X。X可以是任何东西,甚至是TP。例如,假设TP有一个代理键K(自动递增、序列等)和一个T和P的唯一子句。如果D同时有一个K和T的外键,那就不一样了?谢谢@Leonardo。是的,似乎也是这样。我不知道为什么sql server允许进行这种组合,即使它无法使用。在这种情况下,我建议您遵循我的示例。不要创建复合外键,而是在TP中使用代理键K,为{TP.T,TP.P}添加一个唯一子句,然后添加两个NOTNULL子句,一个用于TP.T,另一个用于TP.P。然后D可以有两个外键,一个用于T,另一个用于K。我添加了一个答案。你能复习一下吗。