在一对多关系中使用 FK 与使用连接 table

To use a FK in a one-to-many relationship versus using a join table

首先是一些背景知识:

作为 ta 的表 A
表 B 作为 tb

一个'ta'拥有多个'tb',但一个'tb'只能由一个'ta'拥有。

我通常只是向 'tb' 添加一个指向 'ta' 的 FK,然后就完成了。现在我愿意以不同的方式对其进行建模(以提高其可读性);我想使用连接 table,将其命名为 'ta_tb' 并将 PK 设置为 'tb_id',以强制执行 'one-to-many' 子句。

尽管使用了方法 a,但使用方法 b 时是否存在任何性能问题?

如果这是一个明确的 1:n 关系(而且永远都是!),则没有必要(也没有优势)在两者之间建立新的 table。

这样的连接 table 您将用来建立 m:n 关系。

使用连接 table 和 1:n 关系可能只有一个原因:如果您想管理指定此关系详细信息的其他数据。

HTH

每当您规范化数据库时,性能总会受到影响。如果您执行联接 table(或有时称为交叉引用),dbms 将需要执行工作以联接正确的记录。

如今,DBMS 在创建索引和减少这些性能影响方面做得很好。这取决于你的情况。

可读性和规范化更重要吗?然后使用 join/xref table.

这是针对您想要表现良好的小型应用程序吗?只需让 Table B 对其父对象具有 FK。

如果索引正确,对性能的影响应该很小,尽管会有非常轻微的额外成本,除非您的数据库已经达到极限,否则这种成本可能不会引人注意。

但是,如果您这样做并希望保持 b 列中的每个 id 必须有一个且只有 1 个 a 的想法,那么您需要确保在 id 上放置一个唯一索引 table b中加入table。稍后如果你需要将其更改为多对多关系,你可以删除索引,这肯定比更改数据库结构更容易。否则此设计会使您的数据完整性面临风险。

因此,如果我知道最终可能存在多对多关系,那么连接 table 可能是我会推荐的结构。否则,我可能会坚持 table b.

中更简单的 FK 结构

是的,至少您还需要一个连接才能访问 TableB 字段,这会影响性能。 (这里有一个问题When and why are database joins expensive?

此外,使用连接 table 的关系被称为多对多,在您的情况下,您在中间有一个 PK table "making" 这种一对多关系,并且这比方法 A 的可读性差。

尽可能保持简单,方法 A 非常适合一对多关系。