【问题标题】:Vertical partitioning of tables in MySQLMySQL中表的垂直分区
【发布时间】:2011-10-30 01:42:28
【问题描述】:

另一个问题。

design stage 上的vertically partition 宽表(在我的例子中,我正在考虑将登录详细信息从用户的地址、个人等详细信息中拆分出来)更好还是更好地保留它并在有一些之后对其进行分区数据和做profiling

答案似乎很明显,但我担心有时将行拆分表将意味着重写用户模型的额外工作 + 从更多静态个人详细信息中拆分经常访问的登录详细信息似乎是合理的。

有人对如何进行有一些经验支持的建议:)?提前致谢。

【问题讨论】:

    标签: mysql database-design partition database-partitioning


    【解决方案1】:

    过早的优化是......

    将列拆分到不同的表有缺点:

    • 一些需要单个查询的操作现在需要两个查询或一个连接
    • 强制每个表中的每一行都需要在另一个表中具有相应的行并非易事。因此,您可能会面临完整性问题

    另一方面,这样做是否会提高性能是值得怀疑的。除非您可以事先证明(并且使用随机数据创建一个包含 1000 万条记录的表并运行一些查询是微不足道的),否则我不会这样做。 Doug Kress 关于封装和避免 SELECT * 的建议是正确的方法。

    这样做的唯一原因是如果您的单表设计未规范化并且规范化意味着拆分表。

    【讨论】:

    • 反对。这不会被称为过早优化,而是(高度)标准化。搜索6NF
    • 我会说 6NF 在大多数情况下是过度规范化,但正如我所说,“这样做的唯一原因是如果您的单表设计没有规范化并且规范化意味着破坏表。”
    • 罂粟花。垂直分区有合理(而且很好!)的原因,而且速度并不是唯一的原因。
    • @pbarney 如果有,您可以提及它们 - 如果在评论中,我可能会更新我的答案。或者您可以提供自己的答案。
    【解决方案2】:

    我相信还是把它保留为一个单独的表会更好,但要尽可能地封装你对数据的访问,这样以后可以很容易地重构。

    当您访问数据时,请确保只收集查询中需要的信息(避免使用“SELECT *”)。

    话虽如此,请确保与表一起保存的数据已适当规范化。例如,您可能会发现您想为一个用户存储多个地址 - 在这种情况下,您应该将其放在单独的表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2013-01-27
      • 2015-07-07
      • 2019-10-19
      • 2021-12-01
      相关资源
      最近更新 更多