微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 数据库设计使用子类型与否?

我正在设计的数据库有3个主要表:BOOKS,ARTICLES,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.

例如:

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)

我们不必以任何方式修改Note – 我们仅添加了专门针对杂志的列.

原文地址:https://www.jb51.cc/mssql/77527.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐