MySQL中表的垂直分区

MySQL中表的垂直分区,mysql,database-design,partition,database-partitioning,Mysql,Database Design,Partition,Database Partitioning,另一个问题 在设计阶段对宽表进行垂直分区(在我的例子中,我考虑将登录详细信息从用户的地址、个人等详细信息中分离出来)是更好的方法,还是在拥有一些数据并进行评测后,最好将其保留并对其进行分区 答案似乎很明显,但我担心在某个时候拆分一个表将意味着重写用户模型的额外工作+将经常访问的登录详细信息从更静态的个人详细信息中拆分似乎是合理的 任何人都有一些经验支持的关于如何继续的建议:)?提前感谢。我认为最好将其作为一个表保存,但要尽可能多地封装您对数据的访问,以便以后很容易重构 访问数据时,请确保仅收集查

另一个问题

设计阶段
宽表进行垂直分区(在我的例子中,我考虑将登录详细信息从用户的地址、个人等详细信息中分离出来)是更好的方法,还是在拥有一些数据并进行
评测后,最好将其保留并对其进行分区

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


任何人都有一些经验支持的关于如何继续的建议:)?提前感谢。

我认为最好将其作为一个表保存,但要尽可能多地封装您对数据的访问,以便以后很容易重构

访问数据时,请确保仅收集查询中所需的信息(避免“选择*”)


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

过早优化是

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

  • 某些需要单个查询的操作现在需要两个查询或一个联接
  • 强制要求每个表中的每一行都需要在另一个表中有一个对应的行,这并不是一件小事。因此,您可能会面临完整性问题
另一方面,这样做最多只能提高性能,这是值得怀疑的。除非你能事先证明(用随机数据创建一个1000万条记录表并运行一些查询是很简单的),否则我不会这么做。Doug Kress关于封装和避免SELECT*的建议是正确的方法


这样做的唯一原因是如果您的单表设计没有规范化,而规范化意味着拆分表。

反对。这不是所谓的过早优化,而是(高度)规范化。搜索
6NF
。我想说,在大多数情况下,6NF是过度规范化的,但正如我所说,“这样做的唯一原因是如果您的单表设计没有规范化,而规范化意味着拆分表。”Poppycock。垂直分区有合理的(而且很好的!)原因,速度不是唯一的原因。@pbarney如果有,你可以提到它们-如果是在评论中,我可能会更新我的答案。或者你可以提供你自己的答案。