【问题标题】:SQL Server FK same tableSQL Server FK 同一张表
【发布时间】:2013-03-15 13:26:18
【问题描述】:

我正在考虑将关系表添加到数据库中,并且我想通过使用指向同一个表中的 PK 的 FK 来包含一种反向关系功能。例如,假设我有以下表 RELATIONSHIP:

ID (PK)    Relation      ReverseID (FK)
1          Parent        2
2          Child         1
3          Grandparent   4
4          Grandchild    3
5          Sibling       5

首先,这可能吗?其次,这是解决这个问题的好方法吗?如果没有,您有什么建议?

【问题讨论】:

  • 是的,可以使用 FK 关系引用同一个表。
  • 这称为"self-referencing foreign key"。是的,有可能和使用它的一些原因有already been discussed
  • 那么是否也可以将记录指向自身? (即兄弟姐妹、配偶等)
  • 是的,这也是可能的。作为一般性观察,如果您想知道“X 可能吗?”那么您可以做的最好的事情就是尝试并查看(并阅读相关文档)。这将比在此处发布更快、更轻松地为您提供答案。

标签: sql sql-server database-design foreign-keys


【解决方案1】:

1) 有可能。

2) 在您的情况下,它可能不像您想要的那样理想 - 您有循环,而不是非循环结构 - 因此,如果您的 FK 到位,您将无法按原样插入任何这些行。一种可能性是,在表 DDL 的 ReverseID 列中允许 NULL 后,您必须插入所有具有 NULL ReverseID 的行,然后执行 UPDATE 以设置 ReverseID 列,这些列现在将具有要引用的有效行。另一种可能性是禁用foregin key,或者在数据处于完全有效状态之前不创建它,然后再应用它。

3) 你几乎每次都必须做这样的操作,如果每个关系都有一个相反的关系,你要么不能在模式中强制执行 NOT NULL,要么你会经常禁用和重新启用约束.

4) 兄弟情况相同。

如果可以以某种方式控制并且您理解其含义,我会很好地使用该设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 2018-02-04
    • 1970-01-01
    • 2021-02-28
    • 2018-09-03
    • 2015-12-28
    • 2012-08-07
    • 2014-07-26
    相关资源
    最近更新 更多