Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Database 数据库模式-拆分表而不是具有关系_Database_Database Design - Fatal编程技术网

Database 数据库模式-拆分表而不是具有关系

Database 数据库模式-拆分表而不是具有关系,database,database-design,Database,Database Design,假设我有一个包含5000条记录的表,另一个表包含5个主题的列表。每个主题与较大表中的1000条记录相关联-每个注释都有一个“主题”字段,该字段是主题表的外键 例如,如果数据库在网站上存储了所有用户的评论。将有1000条关于主题A的评论,1000条关于主题B的评论等等 如果我想获得某个特定主题的所有评论,我必须编写一个查询,从可能的5000行中获得正确的1000行。 如果我创建了5个表,每个表只存储关于特定主题的注释,会怎么样 假设永远不会有超过40个主题,这是数据库设计的合理方法吗?我看不出有什

假设我有一个包含5000条记录的表,另一个表包含5个主题的列表。每个主题与较大表中的1000条记录相关联-每个注释都有一个“主题”字段,该字段是主题表的外键

例如,如果数据库在网站上存储了所有用户的评论。将有1000条关于主题A的评论,1000条关于主题B的评论等等

如果我想获得某个特定主题的所有评论,我必须编写一个查询,从可能的5000行中获得正确的1000行。 如果我创建了5个表,每个表只存储关于特定主题的注释,会怎么样

假设永远不会有超过40个主题,这是数据库设计的合理方法吗?我看不出有什么明显的缺点,但它似乎会产生更快的查询结果。

不要走这条路。 它不会更快,但很快就会成为维护的噩梦,因为

  • 您必须为每个新主题添加一个新表
  • 你将不得不做很多的工会工作。。。样式查询如果希望所有主题都有注释, 如果主题列表发生变化,您将不得不修改其中的每一个主题(尽管巧妙地使用视图可以缓解这一问题)
  • 每次你想摆脱一个话题,就得放下一张桌子
只需将所有注释放在一个表中,添加一个带索引的外键,就可以了(5000条记录的数据量非常小,顺便说一句,RDBMS系统通常可以处理数百万行,不会有任何问题)。

不要走这条路。 它不会更快,但很快就会成为维护的噩梦,因为

  • 您必须为每个新主题添加一个新表
  • 你将不得不做很多的工会工作。。。样式查询如果希望所有主题都有注释, 如果主题列表发生变化,您将不得不修改其中的每一个主题(尽管巧妙地使用视图可以缓解这一问题)
  • 每次你想摆脱一个话题,就得放下一张桌子

只需将所有注释放在一个表中,添加一个带索引的外键,就可以了(5000条记录的数据量非常小,顺便说一句,RDBMS系统通常可以处理数百万行,没有任何问题)。

Frank Schmitt是对的

我假设您对关系数据库没有太多的经验——值得一读(Joe Celko有几本书可能会有所帮助)。您描述的问题实际上是RDBMS设计用来解决的关键问题之一;它们通过索引、外键和SQL来实现这一点。如果您正在使用RDBMS,了解这一点是一个好主意,因为有一种解决这些问题的标准方法,而且大多数开发人员都很熟悉

有些时候,这些工具还不够,或者现实生活中的性能问题迫使您设计非“标准”的解决方案,但它们往往不会出现在5000条记录上。如果你能证明你有一个问题,你应该只考虑这些解决方案,因为它们可以解决一个约束,但通常是以其他问题为代价。


这样,如果你能证明你的5000个记录数据库太慢,你已经优化了所有其他东西,在它上面丢了更多的硬件,缓存了它,并且用完了选项,那么你可以考虑按你所描述的方式分割表。这会让维护人员头疼,你的数据库访问代码也变得难以阅读——而负责该项目的新开发人员将有一个WTF时刻,需要培训和文档。

弗兰克·施密特是对的

我假设您对关系数据库没有太多的经验——值得一读(Joe Celko有几本书可能会有所帮助)。您描述的问题实际上是RDBMS设计用来解决的关键问题之一;它们通过索引、外键和SQL来实现这一点。如果您正在使用RDBMS,了解这一点是一个好主意,因为有一种解决这些问题的标准方法,而且大多数开发人员都很熟悉

有些时候,这些工具还不够,或者现实生活中的性能问题迫使您设计非“标准”的解决方案,但它们往往不会出现在5000条记录上。如果你能证明你有一个问题,你应该只考虑这些解决方案,因为它们可以解决一个约束,但通常是以其他问题为代价。


这样,如果你能证明你的5000个记录数据库太慢,你已经优化了所有其他东西,在它上面丢了更多的硬件,缓存了它,并且用完了选项,那么你可以考虑按你所描述的方式分割表。这会让维护人员头疼,您的数据库访问代码也变得难以阅读,而负责该项目的新开发人员将有一个WTF时刻,需要培训和文档。

我关心的是速度,但我还没有实现数据库。如前所述,5000条记录非常小,因此我很可能不需要拆分表。我相信在实践中尝试它会很好。谢谢你的回答,这是一个很好的解释。我关心的是速度,但我还没有实现数据库。如前所述,5000条记录非常小,因此我很可能不需要拆分表。我相信在实践中尝试它会很好。谢谢你的回答,这真是一个很好的解释。