创建新表或添加字段是否有意义

时间:2011-09-08 18:15:59

标签: mysql sql database database-design

我很抱歉,如果这只是询问MySQL表上存储空间的另一种方式,例如: NULL in MySQL (Performance & Storage)

但我的问题确实与最佳做法有关。

问题

假设我有一个表格,可以在给定的时间点收集客户的所有“必要”信息。在接下来的12个月里,我意识到如果他们希望提供它,喜欢捕获这个人的出生日期和性别(字段的数量有些不相关,但理解它可能是一个或50个其他领域)。

最佳做法是将新字段添加到现有表中,设置并允许所有初始值为NULL,然后使用新数据更新现有记录

OR

根据主键的存在创建新表并与主表建立关系?

5 个答案:

答案 0 :(得分:11)

当列添加到表中时,不要太担心,无论是今天还是12个月。相反,只需考虑所涉及的关系。一个人与他们的性别和生日之间存在1:1的关系,因此将这些属性保留在现有表中而不是创建新属性是有意义的。

答案 1 :(得分:3)

在我看来,最好将新列添加到现有表中,因为稍后在路上维护它会容易得多。此外,它在逻辑上属于同一个表。

答案 2 :(得分:0)

我使用的经验法则是,如果我觉得这些数据是将使用rarley的客户记录的扩展,我使用扩展表并节省空间。 如果它是客户记录中不可拆卸的部分,我会选择一个带有空值的表。

这不仅仅是在这里发挥作用的空间,而是针对特定产品的数据建模。 建模有助于您了解并进一步设计应用程序的增长和变化。

希望它有所帮助。

答案 3 :(得分:0)

我建议添加新表。

关系模型中没有null的概念。使用闭合世界假设,通过关系(以及数据库)的缺失来模拟缺失信息。 SQL的三个值逻辑是不直观的,并导致频繁的错误(在Stackoverflow上有大量证据!)因此,不要试图将可空值引入SQL表。归一化到最高法线形式(6NF)会导致新属性位于不同的表格中。

此外,听起来您可能需要多个新表格,例如一个出生日期,另一个人不希望提供出生日期,另一个人没有被要求提供他们的出生日期(也许后者可以省略,而是从另外两个推断,再次关闭世界假设)。

小点:性别=女性,男性等,性别=女性,男性等

答案 4 :(得分:0)

我不是这里的专家,所以这可能不是一个好的答案。只想提出一点:

向现有表添加列可能有一个缺点:如果您使用的是ORM(例如,hibernate),它将在您运行select查询时获取所有列。因此,如果行数变大,则需要获取更多数据,因此查询可能会变慢。如果不经常使用该列,那么创建单独的表可能有意义吗?