如果处于多对多关系并且只有一个列,是否需要单独的数据库 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 中的每一行,这不必要地复杂。
永远不应该更新主键,因此如果存在您可能需要更改某个类型的值的风险,您应该使用代理键:从长远来看,这会让您的生活更轻松 运行.
假设我有一个对书籍进行分类的系统,我想将它们按流派分组,并且有一个 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 中的每一行,这不必要地复杂。
永远不应该更新主键,因此如果存在您可能需要更改某个类型的值的风险,您应该使用代理键:从长远来看,这会让您的生活更轻松 运行.