一个表与多个表

时间:2012-05-15 14:09:20

标签: mysql database-design database-schema conventions

我有以下表格: - 帖子 - 文件 - 活动 - 文件

每个帖子,文件,事件,文档都可以有评论。

对此更好的数据库方案是什么,以及为什么

第一个解决方案

  • 评论表(comment_id,author_id,comment)
  • 创建关系的4个表(posts_comments(post_id,comment_id),files_comments(file_id,comment_id),events_comments(event_id,comment_id),documents_comments(document_id,comment_id))

第二个解决方案

  • 评论表(comment_id,author_id,comment)
  • items_comments(comment_id,parent_type(enum ['post','file','event','document']),parent_id)

对此有什么更好的解决方案,或者我应该使用哪一个?

3 个答案:

答案 0 :(得分:2)

可能有理由需要/需要单个评论表。例如,它可以使查看给定用户的所有注释变得更加简单。此外,搜索所有注释会更简单(在一个表上放置一个FTS索引,您就完成了)。

另一方面,如果没有令人信服的理由将评论保存在单个表中,则可能存在第三种(而且相当明显的)解决方案。

为每个项目(帖子,事件,文件,文档)创建单独的注释表。在这种情况下,RI关系的定义和描述非常简单。此外,如果您经常键入即席查询,则可以使其更简单。例如

 select * from documents d left join doc_comments c 
                           on d.id = c.docid 
                           where d.id=42;

这些对您的情况可能都不重要或重要,但值得考虑。

另外一个随机的想法:OP中的两个解决方案都“感觉”他们正在定义多对多关系(例如,评论可以属于多个项目)。假设这不是理想的情况,可以使用适当的唯一索引来阻止它......但是......它仍然具有初始外观,这似乎可能导致混淆。

答案 1 :(得分:1)

我更喜欢第一种解决方案。 Sql-Statements在那里更简单。在我看来,它更符合数据库规范化

答案 2 :(得分:1)

为了完整起见,我应该提一下另一种可能性 - 继承(又称泛化或(子)类别层次结构):

enter image description here