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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...