首页 > 解决方案 > 单表与多表?

问题描述

我的帖子表有以下列:id、user_id、title、message、date

我的评论表有以下列:id、user_id、post_id、message、date

由于这两个表非常相似,因此最好有一个包含列的表:

id、user_id、parent_id、类型、标题、消息、日期

并且作为父帖子的每一行都将有一个空的 parent_id 值,而作为子帖子的每一行都将有一个空的 title 值。父帖子的类型为 1,子帖子的类型为 2。

编辑:我还将使用评分功能并再次提出相同的问题,2 个特定的 post_rating 和 comment_rating 表,或通用评分表。在评级表的情况下,结构将完全相同,因此没有可为空的字段。评级表也不太可能改变,因为它只知道评级的所有者、实际评级和目标帖子/评论/等。

标签: mysqlsql

解决方案


我不会这样做有几个原因:

  1. 这两者之间存在子/父关系,对于这样的关系,您有外键和单独的表。
  2. 永远不要仅仅因为列的命名相同而使用同一个表。不要试图在这里节省空间,空间不会花费任何东西,但是您以后理解它或更改它的时间会花费。必须解释您的数据库设计(您必须这样做)是由于设计不明确造成的。所以保持干净,不要试图聪明地保存一些位或不必制作新表;)
  3. 对此表的更改总是会影响两个元素,而不仅仅是一个元素。如果您想在评论中添加缩略图链接,您也必须触摸帖子。这导致更多的测试,一切仍然有效。
  4. 在您的表中包含空值是可以的,但并不理想。当您尝试在必须检查空值的编程环境中使用此表时,这当然很烦人
  5. 如果它们继承自同一类型,则可以将它们放入一个表中。例如,您可以有一个“文本”元素,让我们说评论和帖子是文本。但同样,第 1 点的关系仍然成立,这将再次导致丑陋的设计。

关于评分系统:您可以只制作一个带有评分的普通表,评论和帖子表将与评分表建立 FK 关系。就像您现在为用户提供的一样。但是,您也可以制作两个单独的表,以便以后更加灵活,并且它可以使连接更快一点,因为评级表不会变得那么大。但这比其他任何事情都更符合个人喜好。如果评级系统会相互偏离,我当然会制作一个单独的表格,但在这种情况下,我也会选择一个。


推荐阅读