我设计的数据库有3个主要的表: BOOKS
, ARTICLES
, NOTES
。
每本书或文章可以有多个注释,我最初的设计就是这样,这意味着对文章书籍和笔记笔记都去“笔记”表。 下面是该列NOTES
表:
-
note_id
-
note_type
-
note_type_id
-
note_content
NOTE_TYPE
可以是“书”或“文章”; NOTE_TYPE_ID
是FK因为如果 note_type是“书” 或一篇文章的ID如果note_type是“文章”一book_id。
现在,我开始怀疑,如果这是正确的(或最好的归一化)设计。 一种替代方法是使用5个表
书籍/文章/笔记/ book_notes / article_notes
这样我可以保持书的笔记和文章分别指出,列像
'注释'{note_id,note_content} 'book_notes'{book_id,note_id} 'article_notes'{articel_id,note_id}
哪一个是正确的还是更好?
也许有点不同的方法 - 超/亚型通常是在人与父病人和医生的亚型时,你有非常具体的列各亚型,等等。 人持有共同的人,病人和医生都数据保持非常具体列各一个。 在这个例子中你book_notes
和article_notes
是不是真的不同。
我宁愿考虑与书的超类型出版物和文章的亚型。 然后,你可以只有一个注表FK来出版。 考虑到在出版物中PK数相同数目书(文章)的[PK,FK]你可以做与出版,书或文章的笔记连接。 这样,您就可以通过简单地增加一个新的子类表,而不是改变有关注意添加任何其他出版物,如杂志。
例如:
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)
图书和文章表的主键也作为一个外键发布。
现在,如果我们添加另一个出版物,杂志:
TABLE Magazine (ID (PK) = FK to Publication, ... more columns specific to magazines only)
我们不必修改注以任何方式 - 我们已经加入特定只有杂志列。
从某个角度来看,这是从长远来看,使用更好
书籍/ book_notes /条/条注意事项
为您的数据库设计原则。
当你考虑备份,数据处理和数据的可移植性随着时间的推移,在其自己的表中的一个实体的属性开始还清。
无论是真的在绝对意义上“更好”,这取决于上下文。 人们习惯于把任何东西,适合一个柜子,学术数据库设计人员往往造成每支牙刷一个柜子。
在你的情况下,你可能会认为SQL INSERT /选择/更新/的额外开销删除3个音符表,而不是只有一个是不值得的。 从长远来看,如果你用“1个音符表”的设计开始走,然后再决定你不喜欢它,它分成3不像重写战争与和平。
NOTE_TYPE
可以是“书”或“文章”; NOTE_TYPE_ID
是FK的book_id 中频 note_type是“书” 或一篇文章的ID如果note_type是“文章”。
当在逻辑数据模型来表示这种关系被称为弧。
如果你没有预见任何音符重复它的罚款。 不只是书本,但也物品之间。
这取决于你想与亚型分类做什么。 在主表的书籍和文章看起来像“出版物”的亚型。 然而,对于“出版物”不表。 那是因为你并不需要搜索出版物,还是因为你没有想到在“泛化专业化关系建模”的条款? 如果你看到了这句话在网络上,你会看到一些关于这个问题的好文章。
假设你并不需要一个广义的“出版物”的表,那么你可能并不需要一个广义的“笔记”表可能。 你将要寻找的笔记哪里都无所谓的说明指的是哪种刊物的? 它有多长将是您要添加第三或第四种出版过吗?
所有这些都在其设计的“概念更好”的影响。 如果你想要的东西更好的概念,那么你就优化,无论你是否意识到这一点。 你可能对于善良比速度或简单的不同措施进行优化。
这听起来像你的主要重点应注意事项 。 鉴于这种说法我想创建一个 - 的数据结构。
注意将包含 (超),只从书本和文章是 (亚型)的项目。
注超领域:
- NoteId
- NoteContent
- NoteTypeId(1 =书2 =文章)
常见的亚型领域:
书唯一字段:(NoteTypeId = 1)
文章唯一字段:(NoteTypeId = 2)
这使得peolpe搜索或浏览按内容,类型,标题,作者和日期所有的笔记 。 然后,以获取更多信息你深入到子类型的详细信息。
这也使得生长,使您可以轻松地添加其他亚型是必要的。 例如博客(NoteTypeId = 3),FaceBookPages(NoteTypeId = 4)等。