我正在设计的数据库有3个主要表:BOOKS,ARTICLES,NOTES.
每本书或文章都可以有多个笔记,我的原始设计就是这样,这意味着书上的注释和文章上的注释都会出现在“笔记”表中.以下是NOTES表的列:
每本书或文章都可以有多个笔记,我的原始设计就是这样,这意味着书上的注释和文章上的注释都会出现在“笔记”表中.以下是NOTES表的列:
> note_id
> note_type
> note_type_id
> note_content
NOTE_TYPE可以是’book’或’article’;如果note_type是’book’,则NOTE_TYPE_ID是book_id的FK;如果note_type是’article’,则NOTE_TYPE_ID是article id.
现在我开始怀疑这是否是正确的(或最佳标准化的)设计.另一种方法是使用5个表
书籍/文章/笔记/ book_notes / article_notes
这样我就可以分别保存书本笔记和文章笔记,列就像
‘notes'{note_id,note_content}
‘book_notes'{book_id,note_id}
‘article_notes'{articel_id,note_id}
哪一个更正或更好?
解决方法
也许有点不同的方法 – 当你为每个子类型都有非常特定的列时,通常会使用超类型/子类型,例如具有患者和医生子类型的Person超类型.人保存所有人共有的数据,患者和医生为每个人保留非常具体的列.在这个例子中,你的book_notes和article_notes并没有那么不同.
我宁愿考虑使用超类型出版物以Book和Article作为子类型.然后你可以只有一个带有FK to Publication的Note表.考虑到出版物中的PK编号与书籍(文章)的[PK,FK]编号相同,您可以加入出版物,书籍或文章的注释.
通过这种方式,您可以添加一个新的子类表而不更改有关Note的任何内容,只需添加另一个出版物,如Magazine.
我宁愿考虑使用超类型出版物以Book和Article作为子类型.然后你可以只有一个带有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,PublicationID FK to Publication,NoteText)
Book和Article表的主键也可作为Publication的外键.
现在如果我们添加另一个出版物,杂志:
TABLE Magazine (ID (PK) = FK to Publication,... more columns specific to magazines only)