1

我不确定我是否正确地命名了这个问题。

假设有两张表:一张代表用户,另一张代表地址。一个用户只能有一个地址:

CREATE TABLE User (
    id INT NOT NULL,
    full_name VARCHAR(255),
    PRIMARY KEY(id)
);

CREATE TABLE Address (
    id INT AUTO_INCREMENT NOT NULL,
    address_line_1 VARCHAR(255),
    address_line_2 VARCHAR(255),
    PRIMARY KEY(id)
);

问题是:放置外键引用的正确位置在哪里?我是否应该通过创建引用 Address.id 的“address_id”列将引用列放入用户表中?还是应该将 user_id 列放入引用 User.id 的地址表中?

4

2 回答 2

2

当您有 1-1 关联时,您首先需要问自己为什么会存在这种关联?大多数情况下,它表明设计不完整或不准确。有时1-1是正确的,不要误会我的意思,但你必须证明它的存在。

话虽如此,在您的情况下,您可能会将用户作为主表访问。您的最终用户可能正在通过用户 ID 查找用户配置文件,然后向下钻取或导航到更多配置文件信息,例如地址。如果是这种情况,FK 将属于地址表。但是,如果您的业务是这样的,您的最终用户将主要浏览地址信息,然后深入到用户信息,那么 FK 将属于用户表。

您需要在此处完成的另一件事是 FK 是强制性的还是可选的(非 Null 或 Nullable),因为这会影响 RI。如果我删除用户会怎样?对应的地址应该消失吗?

于 2013-11-06T14:47:50.783 回答
0

在这里有机会在同一地址获得更多用户,因此将外键放在地址表中将是我的选择。

于 2013-11-06T14:42:50.877 回答