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 – 我们仅添加了专门针对杂志的列.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03