mysql - 单表与多表?
问题描述
我的帖子表有以下列: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 表,或通用评分表。在评级表的情况下,结构将完全相同,因此没有可为空的字段。评级表也不太可能改变,因为它只知道评级的所有者、实际评级和目标帖子/评论/等。
解决方案
我不会这样做有几个原因:
- 这两者之间存在子/父关系,对于这样的关系,您有外键和单独的表。
- 永远不要仅仅因为列的命名相同而使用同一个表。不要试图在这里节省空间,空间不会花费任何东西,但是您以后理解它或更改它的时间会花费。必须解释您的数据库设计(您必须这样做)是由于设计不明确造成的。所以保持干净,不要试图聪明地保存一些位或不必制作新表;)
- 对此表的更改总是会影响两个元素,而不仅仅是一个元素。如果您想在评论中添加缩略图链接,您也必须触摸帖子。这导致更多的测试,一切仍然有效。
- 在您的表中包含空值是可以的,但并不理想。当您尝试在必须检查空值的编程环境中使用此表时,这当然很烦人
- 如果它们继承自同一类型,则可以将它们放入一个表中。例如,您可以有一个“文本”元素,让我们说评论和帖子是文本。但同样,第 1 点的关系仍然成立,这将再次导致丑陋的设计。
关于评分系统:您可以只制作一个带有评分的普通表,评论和帖子表将与评分表建立 FK 关系。就像您现在为用户提供的一样。但是,您也可以制作两个单独的表,以便以后更加灵活,并且它可以使连接更快一点,因为评级表不会变得那么大。但这比其他任何事情都更符合个人喜好。如果评级系统会相互偏离,我当然会制作一个单独的表格,但在这种情况下,我也会选择一个。
推荐阅读
- angular - 带有 domSanitizer 的 innerHtml 不接受 angular 的原生属性
- reactjs - For Loop 在 React 中没有显示正确的结果
- d3.js - 如何将“Y”比例数据与“X”比例域匹配
- node.js - 使用 Google Cloud Storage 将音频文件从 Google Text-to-Speech 保存到 Firebase Storage?
- visual-studio-2010 - VS2008/VS2010 和 TFS 2018:用户名 [ID] 不是完全限定的用户名。参数名称:workspaceOwner
- reactjs - 设置和镜像 2 个 React.js 组件的最简单方法是什么
- math - 如何用二进制补码固定点添加固定点?
- javascript - 将数据表导出到 Excel 无法打开文件
- c - 如何为矩阵中的特定元素动态分配内存?
- c++ - 在项目中移动文件,现在我找不到命名空间