Sql DB设计是否使用子类型?

Sql DB设计是否使用子类型?,sql,database-design,data-modeling,Sql,Database Design,Data Modeling,我正在设计的数据库有三个主要表:书籍,文章,注释 每本书或每篇文章都可以有多个注释,我最初的设计就是这样,这意味着书上的注释和文章上的注释都可以放在“注释”表中。以下是注释表的列: note\u id 注意类型 note\u type\u id 注意内容 NOTE_TYPE可以是“book”或“article”NOTE\u TYPE\u ID如果NOTE\u类型为“book”则为书籍ID的FK,如果NOTE\u类型为“article”,则为文章ID的FK 现在我开始怀疑这是否是正确的(或最佳

我正在设计的数据库有三个主要表:
书籍
文章
注释

每本书或每篇文章都可以有多个注释,我最初的设计就是这样,这意味着书上的注释和文章上的注释都可以放在“注释”表中。以下是
注释表的列:

  • note\u id
  • 注意类型
  • note\u type\u id
  • 注意内容
NOTE_TYPE
可以是“book”或“article”
NOTE\u TYPE\u ID
如果NOTE\u类型为“book”则为书籍ID的FK,如果NOTE\u类型为“article”,则为文章ID的FK

现在我开始怀疑这是否是正确的(或最佳规范化的)设计。另一种方法是使用5个表

书籍/文章/笔记/书籍笔记/文章笔记

这样我就可以分别保存书本笔记和文章笔记,列如下

'notes'{note_id,note_content} 'book_notes'{book_id,note_id} “文章注释”{articel\u id,note\u id}


哪一个是正确的还是更好的?

从某种角度来看,从长远来看,使用它要好得多

书籍/书籍注释/文章/文章注释

作为数据库的设计原则

当您考虑备份、数据操作和数据可移植性随时间的推移时,单个实体在其自己的表中的属性开始得到回报。

两者都不是绝对意义上的“更好”,这取决于上下文。人们习惯于把任何东西放在一个合适的橱柜里,学术数据库设计师倾向于为每把牙刷创建一个橱柜


在您的上下文中,您可能认为3个notes表(而不是仅一个)的sql insert/select/update/delete的额外开销是不值得的。从长远来看,如果您最初采用“1注释表”设计,然后决定不喜欢它,那么将其拆分为3并不像重写《战争与和平》。

可能有点不同的方法——当您为每个子类型都有非常特定的列时,通常使用超类型/子类型,类似于具有“患者”和“医生”子类型的“面对面”超类型。Person保存所有人共有的数据,而Patient和Doctor为每个数据保留非常特定的列。在本例中,您的
book\u notes
article\u notes
没有太大区别。
我宁愿考虑一个超级类型出版物与书籍和文章作为子类型。然后,您可以只拥有一个带有FK的注释表。考虑到出版物中的PK编号与书籍(文章)的[PK,FK]编号相同,您可以使用出版物、书籍或文章上的注释进行连接。通过这种方式,您可以简单地添加另一个出版物,如杂志,方法是添加一个新的子类表,而不更改有关注释的任何内容

例如:

表发布(
ID(主键)
标题
,--任何出版物共有的更多列
)
餐桌簿(
ID(PK)=FK到发布
,ISBN
,--更多只针对书籍的专栏
)
表格文章(
ID(PK)=FK到发布
,--更多特定于文章的列)
表注(
ID(主键)
,PublicationID=FK到出版物
,NoteText
)
书籍
文章
表格的主键也可用作
出版物
的外键

现在,如果我们添加另一个出版物,杂志:

表格库(
ID(PK)=FK到发布
,--更多只针对杂志的专栏
)
我们不必以任何方式修改
Note
——我们只添加了特定于杂志的专栏


NOTE_TYPE
可以是“book”或“article”
NOTE\u TYPE\u ID
是书籍ID的FK,如果NOTE\u TYPE是“book”,或者如果NOTE\u TYPE是“article”,则是文章ID

这种关系在逻辑数据模型上表示时称为弧


如果你没有预见到任何音符的重复,那就好了。不仅在书与书之间,在文章之间也是如此。

这取决于你想如何使用子类型。在主表中,书籍和文章似乎是“出版物”的子类型。但是,没有关于“出版物”的表格。这是因为您不需要搜索出版物,还是因为您没有考虑“泛化-专业化-关系建模”?如果你在网上查找这个短语,你会看到一些关于这个主题的好文章

假设您不需要一个通用的“publications”表,那么您可能也不需要一个通用的“notes”表。您是否要在注释所指的出版物类型无关紧要的地方搜索注释?您需要多长时间才能添加第三种或第四种出版物


所有这些都会影响“概念上更好”的设计。如果您想要概念上更好的东西,那么无论您是否意识到,您都在进行优化。您可能在优化与速度或简单性不同的善的度量

听起来你的主要精力应该放在笔记上。给出该语句,我将创建一个超类型-子类型数据结构

注释将包含使注释唯一的所有内容(超类型),并且仅包含书籍和文章中对所有内容通用的项目(子类型)

注意:超类型字段:

  • 记事本
  • NoteTypeId(1=书籍2=文章)
通用子类型字段:

  • 头衔
  • 作者
  • 日期
图书唯一字段:(NoteTypeId=1)

  • ISBN
  • 出版者
  • 价格
文章唯一字段:(NoteTypeId=2)

  • 韦比特
  • 分配权
这允许人们按内容、类型、标题、作者和日期搜索或浏览所有笔记。然后,有关详细信息,请深入到子类型详细信息。

这也允许fo