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

sco*_*ttm 12 sql foreign-keys sql-server-2008-r2

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

CREATE TABLE Account (Id int NOT NULL)

CREATE TABLE Customer (AccountId int NOT NULL)
Run Code Online (Sandbox Code Playgroud)

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

选项1:

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

选项2:

ALTER TABLE [dbo].[Account]  WITH CHECK 
  ADD  CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([Id])
  REFERENCES [dbo].[Customer] ([Id])
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 6

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

现在,话虽如此,请致电实体CustomerIDAccountID任何地方。它在主表上似乎是多余的,但名称在整个模型中应该是一致的。

  • 如果您要使用 Rails 和受 Rails 启发的框架,那是不正确的。在这种情况下,当 id 是主键时,它只是像“customers.id”这样的“id”——这很明显。当作为外键引用时,您可以像这样执行 `accounts.customer_id`。 (6认同)
  • 关于命名的 1000% 同意。您不应使用 ID 作为 PK 的字段名称 - 始终以实体名称为前缀。这在使用使用基于约定的映射的 ORM 时尤其重要,因为这通常是他们期望模型的外观。缺点是你必须在编写连接时限定你的对象,但是`a)`你无论如何都应该这样做,`b)`使用ORM你可能不会写太多/任何T-SQL (5认同)

Udo*_*ein 5

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

  • 因此,帐户可以在没有客户的情况下存在,但客户不能与帐户一起存在。因此,客户应该指向帐户,而不是相反。--> 选项 1 (2认同)