Sha*_*awn 7 sql database-design data-modeling
我设计的数据库有3个主要的表:BOOKS,ARTICLES,NOTES.
每本书或文章都可以有多个笔记,我的原始设计就是这样,这意味着书上的注释和文章上的注释都会出现在"笔记"表中.以下是NOTES表格的列:
note_idnote_typenote_type_idnote_contentNOTE_TYPE可以是"书"或"文章"; NOTE_TYPE_ID是FK的book_id 如果该note_type是"书" 或一篇文章的ID如果note_type是"文章".
现在我开始怀疑这是否是正确的(或最佳标准化的)设计.另一种方法是使用5个表
书籍/文章/笔记/ book_notes/article_notes
通过这种方式,我可以分别保留书籍笔记和文章笔记,列就像
'notes'{note_id,note_content}'book_notes'{book_id,note_id}'article_notes'{articel_id,note_id}
哪一个更正或更好?
Dam*_*vic 11
也许有点不同的方法 - 当你为每个子类型都有非常特定的列时,通常会使用超类型/子类型,例如具有Patient和Doctor子类型的Person超类型.人保存所有人共有的数据,患者和医生为每个人保留非常具体的列.在这个例子中你的book_notes并article_notes没有那么不同.
我宁愿考虑使用超类型出版物以书籍和文章作为子类型.然后你可以只有一个带有FK to Publication的Note表.考虑到出版物中的PK号码与书籍(文章)的[PK,FK]相同,您可以与出版物,书籍或文章上的注释一起加入.通过这种方式,您可以添加一个新的子类表,而不是更改有关Note的任何内容,只需添加另一个出版物,如Magazine.
例如:
TABLE Publication (
ID (PK)
, Title
, -- more columns common to any publication
)
TABLE Book (
ID (PK) = FK to Publication
, ISBN
, -- more columns specific to books only
)
TABLE Article (
ID (PK) = FK to Publication
, -- more columns specific to articles only)
TABLE Note (
ID (PK)
, PublicationID = FK to Publication
, NoteText
)
Run Code Online (Sandbox Code Playgroud)
Book和Article表的主键也可用作出版物的外键.
现在如果我们添加另一个出版物,杂志:
TABLE Magazine (
ID (PK) = FK to Publication
, -- more columns specific to magazines only
)
Run Code Online (Sandbox Code Playgroud)
我们不必以任何方式修改Note - 我们只添加了专门针对杂志的列.