Mysql 一张表与多张表
我有以下表格: -职位 -档案 -事件 -文件 每个帖子、文件、事件、文档都可以有评论 这方面更好的数据库方案是什么,为什么 第一个解决方案Mysql 一张表与多张表,mysql,database-design,database-schema,conventions,Mysql,Database Design,Database Schema,Conventions,我有以下表格: -职位 -档案 -事件 -文件 每个帖子、文件、事件、文档都可以有评论 这方面更好的数据库方案是什么,为什么 第一个解决方案 注释表(注释id、作者id、注释) 创建关系的4个表(帖子注释(帖子id,注释id),文件注释(文件id,注释id),事件注释(事件id,注释id),文档注释(文档id,注释id)) 第二种解决方案 注释表(注释id、作者id、注释) 项目注释(注释id、父项类型(枚举['post'、'file'、'event'、'document'])、父项id)
- 注释表(注释id、作者id、注释)
- 创建关系的4个表(帖子注释(帖子id,注释id),文件注释(文件id,注释id),事件注释(事件id,注释id),文档注释(文档id,注释id))
- 注释表(注释id、作者id、注释)
- 项目注释(注释id、父项类型(枚举['post'、'file'、'event'、'document'])、父项id)
有什么更好的解决方案,或者我应该使用两种解决方案中的哪一种?我更喜欢第一种解决方案。那里的Sql语句更简单。在我看来,它更符合数据库规范化可能有真正的原因需要一个注释表。例如,它将使查看给定用户的所有评论变得更简单。此外,搜索所有注释会更简单(在一个表上放置一个FTS索引,您就完成了) 另一方面,如果没有令人信服的理由将注释保存在一个表中,那么可能会有第三种(相当明显的)解决方案 为每个项目(帖子、事件、文件、文档)创建单独的注释表。在这种情况下,RI关系的定义和描述将非常简单。此外,如果您经常键入临时查询,这可能会使它更简单。比如说
select * from documents d left join doc_comments c
on d.id = c.docid
where d.id=42;
这些可能都与您的情况无关或不重要,但可能值得考虑
一个额外的随机想法:OP中的两个解决方案都有一种“感觉”,即它们定义了多对多关系(例如,一条注释可以属于多个项目)。假设这不是理想的情况,可以使用适当的唯一索引来防止这种情况。。。但还是。。。它具有最初的外观,似乎可能会导致混淆。为了完整性,我应该提到另一种可能性-继承(也称为泛化或(子)类别层次结构):
我更喜欢第一种解决方案,要灵活,因此您必须通过编辑一个名称(如果您愿意)将名称文件更改为文件,而不是在第二种解决方案的items\u comments表中的所有名称。Als试图理解数据库规范化