如果处于多对多关系并且只有一个列,是否需要单独的数据库 table?

Is a separate database table required if it's in a many-to-many relationship and only has a single column?

假设我有一个对书籍进行分类的系统,我想将它们按流派分组,并且有一个 UNF 元组:

BookId (PK): number
BookTitle: string
Blurb: string
Genres: string[]
(... everything else)

规范化后,流派需要成为原子的,并且还需要放入它自己的关系中,以免造成重复。我的第一直觉是执行以下操作:

BOOK
BookId (PK): number
BookTitle: string
Blurb: string

GENRE
GenreId (PK): number
GenreName: string

BOOKGENRE
BookId (CK): number
GenreId (CK): number

但我又想到了另一个想法,但感觉有点……不对(?),好像这是一种不好的做法。但我的想法是通过简单地将 GenreName 字段设为主键并仅使用 BOOKGENRE 来摆脱 GENRE table。由于 GenreName 仍然会被索引,因为它是复合键的一部分,因此它仍然会被索引并且可以高效地执行操作,例如获取所有 Genre "X".

的书籍
BOOK
BookId (PK): number
BookTitle: string
Blurb: string

BOOKGENRE
BookId (CK): number
GenreName (CK): string

这是接受table的做法还是要求我将流派作为一个单独的 table 并使用密钥?

我建议坚持使用三个独立的 table 和一个整数主键的原始设计。一个原因是您想要无意义的键,即没有业务意义的键。

有了您正在考虑的替代设计,如果您想重命名一个类型,比如从 Sci-Fi 改名为 Science Fiction,该怎么办?您需要更新 bookgenre table 中的每一行,这不必要地复杂。

永远不应该更新主键,因此如果存在您可能需要更改某个类型的值的风险,您应该使用代理键:从长远来看,这会让您的生活更轻松 运行.