17

有什么不同?如果我有这两个表:

CREATE TABLE Account (Id int NOT NULL)

CREATE TABLE Customer (AccountId int NOT NULL)

我想要一个链接两者的外键,我应该做以下哪一个,为什么?

选项1:

ALTER TABLE [dbo].[Customer]  WITH CHECK 
  ADD  CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([AccountId])
  REFERENCES [dbo].[Account] ([Id])

选项 2:

ALTER TABLE [dbo].[Account]  WITH CHECK 
  ADD  CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([Id])
  REFERENCES [dbo].[Customer] ([Id])
4

3 回答 3

6

取决于上下文。每个客户都有客户吗?哪个是家长?似乎一个帐户有多个客户,在这种情况下,引用属于客户表。

现在,也就是说,请致电实体CustomerIDAccountID任何地方。它在主表上似乎是多余的,但名称应该在整个模型中保持一致。

于 2013-02-21T17:36:44.390 回答
5

我会使用从孩子到父母的外键。最重要的问题是:如果您需要删除其中一个实体会发生什么?

于 2013-02-21T17:36:18.740 回答
0

FK(外键)告诉 DBMS,列列表的子行值必须作为列列表的子行值出现在别处。每当发生这种情况(并且其他声明尚未暗示)时,声明 FK。此外,如果您希望在更改引用表时将 CASCADE 操作应用于引用表,请声明。

(CASCADE 没有什么特别之处,它不能用于非 FK 情况。它只是经常出现在 FK 中,并且有一个明确的 FK 图可以合理地限制它们的交互。)

如果有FK 循环,那么您将需要使用触发器。您决定以声明方式强制执行哪些约束以及哪些通过触发器应考虑(所需)约束图。

于 2017-07-24T22:05:01.623 回答