Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一张表与多张表_Mysql_Database Design_Database Schema_Conventions - Fatal编程技术网

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试图理解数据库规范化