为该类别建立一个表,为具有相似字段的子类别建立另一个表,为啥?

Posted

技术标签:

【中文标题】为该类别建立一个表,为具有相似字段的子类别建立另一个表,为啥?【英文标题】:DB a table for the category and another table for the subcategory with similar fields, why?为该类别建立一个表,为具有相似字段的子类别建立另一个表,为什么? 【发布时间】:2011-01-05 20:36:10 【问题描述】:

我最近加入了一家新公司,开发团队正在进行一个重建数据库类别结构的项目,如下所示:

如果我们有项目的类别和子类别,例如食品类别中的食品类别和意大利食品类别。 他们为每个类别构建了一个表格,而不是一个表格和一个指向类别 ID 的链接。

现在我们有一张名为 food 的桌子 还有一张叫 food_italian 的桌子 并且两个表都包含相同的字段。

我四处询问,似乎有些 DBA 更喜欢这种设计。我想知道为什么?以及这种设计如何提高性能?

【问题讨论】:

【参考方案1】:

首先,最明显的答案是你应该问他们,而不是我们,因为我可以告诉你,那个设计看起来很奢侈。

我能想到的唯一原因是,您的 DBA 经验不足,不知道如何调整数据库的性能,并且似乎认为行数较少的表总是会大大优于行数较多的表。

有了好的索引,情况就不必如此了。

【讨论】:

谢谢你的回复,我其实已经问过他们了,但答案似乎不合理,这就是我在这里的原因。答案是通过减少表中的连接数量,我们将在获取行时获得性能。由于我们在网站上有成千上万的访问者进行发布和搜索。我能想到的方法是有一个带有 fk 的类别表,以对类别有无限的深度,然后再有另一个带有类别元的表,以防我们需要为某些类别提供更多字段。他们使用 phinx,我们可以使用 lucene 进行搜索。 在我说完抱歉之前评论已经结束 - 我想说更多,我正在尝试收集数据库性能方面的一些事实,以将我在之前评论中描述的内容与开发人员正在做的事情进行比较。更值得考虑他们正在做什么的问题是,另一家真正的大公司 DBA 决定在他们的数据库上做同样的事情。我在挖掘这个消息时听到了这个消息。但我无法联系到他问他为什么。更少的连接会提高性能是否有意义? 是的,更少的连接会提高性能,但是像这样对表进行分区将是维护的噩梦。所以这一切都取决于你关注的重点。 它对性能的影响有多大?我可以在某处获得数字吗?每个设计的查询时间(毫秒) 不,这取决于太多因素,除了与您的服务器、您的数据和您的查询一起运行的分析工具之外,任何人都无法提供给您。恐怕这里没有确凿的事实。我可以保证这将是一场维护噩梦,特别是如果你后来决定“嗯,树上的果实有一个属性决定了它们生长的高度,但灌木上的果实不需要那个,所以让我们使表格的结构不同。”【参考方案2】:

做任何事情的方法不止一种。

我在做食物时看到的可能的好处,food_italian...是它允许table partitioning。如果您使用 myisam,则使用许多不同的表可以实现更好的表锁定机制。

【讨论】:

以上是关于为该类别建立一个表,为具有相似字段的子类别建立另一个表,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何建立数据库表、数据库设计

Laravel - 从 ajax 响应数据中的产品 (belongsTo) 访问子类别。

应该如何为具有不同字段的几个猫鼬模型创建模式?

对属于不同类别的具有非常相似特征的图像进行分类

mysql创建索引的原则

vue后台管理系统开发流程全记录_类别管理功能开发: 类别新增