是否应在父表或子表上创建外键?

时间:2013-02-21 17:34:20

标签: sql sql-server-2008-r2 foreign-keys

有什么区别?如果我有这两个表:

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])

3 个答案:

答案 0 :(得分:4)

取决于具体情况。每个客户都有客户吗?哪一个是父母?似乎帐户有多个客户,在这种情况下,引用属于Customer表。

现在,请说实际上,请致电实体CustomerIDAccountID。在主表上看起来似乎是多余的,但名称在整个模型中应该是一致的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

如果有FK cycle,则需要使用触发器。您决定以声明的方式强制执行哪些约束。触发器应该考虑(期望的)约束图。