应该有外键 "to" 关联实体,还是 "from" 关联实体?

Should there be a foreign key "to" an associative entity, or "from" the associative entity?

我正在尝试为一家书店建立一个数据库。以下是总体设计的较小子集。

目前我有一个 Book 实体,其中包含 ISBN(主键)、标题和其他一些属性。

我有一个作者实体 author_id(主键),名称。

因为书和作者是 many-to-many 关系。我有 Authorted_title 关联实体,ISBN 和 author_id 作为属性。所以 ISBN 是 Book 实体的外键,author_id 是 Author 实体的外键。

我的问题是,是否可以将 Book 实体的 ISBN 作为外键,并将 Author 实体的 author_id 作为外键,作为关联实体 Authored_title 中各个属性的外键?周围(与我在上一段中提到的相反)?

想想有点懵。当涉及到 FK 时,桌子之间甚至有 "to" 和 "from" 之类的东西吗?

没有。您的初始实施是正确的。您 link table 中的 FK 引用了您实体 table 中的 PK。

编辑

无法添加引用您的 link table 的外键,因为外键需要引用主键。您需要 link table 上的两列作为主键,显然这是不可能的。

FK -> PK 关系本质上是 many -> one。在您的情况下,link table 上的许多行将引用实体 table.

上的一行

外键约束的想法是,如果 table Y 中没有与 X 相关的记录,它会阻止在 table X 中创建记录。在您的情况下,作者和书籍具有主键,将 M:M 关系分解为两个 1:M 关系的 Book_Author table 以作者和书籍为键;您不能在 Book_Author 中创建记录,除非您先在 Book 中创建了记录并在 Author

中创建了记录

您似乎在问是否可以反过来做,将书 table 和作者 table 键入 Book_Author table

答案是否定的(好吧,没有什么是不,但这是真的,真的,不应该)

为了接受外键关系,Book_Author 必须有一个主键。您将选择什么作为主键?您可以使用 BookID+AuthorID。您可以有一个单独的递增 int 或一个 guid,但是将这种 PK 放在 table 上会破坏 M:M 关联,这在 "just because you can, doesn't mean you should" 列表中。 您不能仅针对主键的一部分建立外键,因此如果 Book 和 Author 键控到 Book_Author,并且 Book_Author 具有复合 PK,则另一个 table s (Book, Author) 将需要额外的列来覆盖键的其他元素;您最终会在书 table 中存储作者,在作者 table 中存储一本书。那么一本有两位作者的书呢?它需要 Book table 中的两个条目,每个作者一个。我们应该在标准化数据库时主动删除这种软数据重复。这一步是主动去规范化。将递增 PK 放在 Book_Author table 上存在相同的论点;你如何表示一本书有两位作者?您的关联 table 中需要 2 行,并且它们不能具有相同的 PK 值,所以让我们给它们不同的值:

BookAuthorId, Book, Author
1, GoodOmens, NeilGaiman
2, GoodOmens, TerryPratchett

现在我们必须为这些创建书籍,引用我们在 Book_Author 中的主键列的书籍:

Book Name, BookAuthorId, Description
Good Omens, 1, A funny story about life as a fallen angel
Good Omens, 2, A funny story about life as a fallen angel

你花越多时间思考这个概念,"Book_Author should be the primary key, and the Book and Author tables should foreign key to it"你就会越多地意识到它绝对不可行,什么也解决不了,只会让人头疼

一本书,一本书中的一行table。一位作者,作者中的一行。我们有这些规则是因为只有一个特里普拉切特,一个尼尔盖曼,一个叫做好兆头的故事。所有这些 "one" 东西都应该有一行,一个主键标识它..当我们想 link 这些东西组合在一起时,我们使用另一个 table 有一个复合键确保我们不能将 Neil Gaiman 记录为写过 Good Omens 两次,以及确保我们 link 在一起的书和作者确实存在的外键。没有必要将书分配给不存在的作者,和不存在的书籍给作者..

所以,这就是为什么这些东西是 "that way" 圆的原因; "other way round" 没有任何好处