【问题标题】:When to add a column vs adding a related table?何时添加列与添加相关表?
【发布时间】:2021-08-29 19:07:04
【问题描述】:

我有一个超过 1 亿行的大表。几个月来我一直在削减它以摆脱不良数据(明智的行),试图保持它的小。我在这张桌子上已经有 9 列了。我想向它添加一个新的布尔列。以下是当前状态。

这张桌子一开始很小,现在变得很宽。再一次,我的任务是为每行添加更多信息。这次是一个新的布尔字段。我希望这个字段的数量很少,这意味着不到 10% 的人会将这个设置为真。我知道我可以将其设为默认 null,它是一个应该很小的布尔列。

但是,我想得到一些建议。这张桌子不能无限宽,我需要解决这个问题。在这种情况下,当我有额外的数据要添加时,创建另一个表和外键引用记录是否更有意义?专业人士在数据库设计中是如何处理这个问题的?

可用性的最佳情况是所有数据都在记录中,这样任何形式的查询都可以在表本身上获取或计算而无需连接。我只是不相信它会扩展到 10 亿行(插入 meme)。

【问题讨论】:

标签: mysql database database-design


【解决方案1】:

在我的工作中,我支持具有数十亿行表的 MySQL 实例。在这种规模下,必须注意正确优化查询。您不想以这种规模进行表扫描。

但这是关于行,而不是列。您首先询问了列。

在添加列与添加另一个表之间进行选择的方法是关注rules of database normalization。如果新列用于与当前表相同的实体的属性,则将该列添加到该表。如果它是一个多值属性,或者它确实是某个其他实体的属性,则将其添加到不同的表中。

仅仅因为列太多而创建另一个表是非常非常罕见的正确选择。一个给定的 MySQL 表可以很容易地有几十列,如果你小心的话,可以有几百列。

理论上,对于规范化而言,可能适合放入同一个表中的列数没有限制。但是由于在给定实现中存储这些列的代码(例如 MySQL 中的 InnoDB 存储引擎)存在限制。

https://www.percona.com/blog/2013/04/08/understanding-the-maximum-number-of-columns-in-a-mysql-table/

因此,MySQL 中表的最大列数介于 191 到 2829 之间,具体取决于多种因素。

在那个博客的 cmets 中,我能够设计一个无法在 59 列创建的表。阅读博客了解详情。

【讨论】:

  • 这是一个很好的答案!而正是我正在寻找的答案。我专心地遵循数据库规范化的规则,但我不确定这些规则何时不再适用。听起来列通常是最后一个问题,在此之前每一个都成为问题,查询将。赞一个!
  • 是的,但是就是说,如果您发现自己在一个表中添加了数百列,那就是code smell
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多