创建db表NULL最佳实践

时间:2010-12-13 16:46:46

标签: sql database database-design null

当我有一个表,其中有时只填充两个字段在行中创建大量NULL值时,不确定处理NULL值的最佳实践是什么。

是否应将两个字段移动到一个单独的表中,创建两个没有NULL值的表?

这两个表之间的连接只会返回一个与我的原始表等于NULL的结果,那么它的重点是什么?

将它们分开似乎毫无意义,但我一直在阅读有关在db中一起避免null的一些内容。

欢迎任何想法。

4 个答案:

答案 0 :(得分:10)

  1. 纯理论上,NULL应该表示“未知值”。所以 - 再次,纯粹理论上 - 你应该在规范化时设计你的表,这样你就不需要填写NULL值来表示“不适用于这一行”。但是,这一点与任何实际考虑因素(设计,性能或查询可读性)无关。

  2. 实际上,有一些性能方面的考虑因素。在以下情况下,您应该将非常稀疏的数据标准化:

    • 缩短表格(IO方式和/或空间方式)都有实质性的好处。 NULL占用空间,行越宽,性能越差。当表有很多行并且有许多这样的稀疏列时尤其如此。对于只有2个这样的列的小型表,实现的好处可能不值得额外加入。

    • 您的查询在WHERE子句中包含相关列。 IIRC,查询严重空的列非常低效。

    • 另一方面,在某些时候,在查询中有额外的连接可能会损害优化器的性能(至少一旦你的连接有10多个表就会这样做 - 在优化器运行时占用CPU资源实际上混淆优化器选择一个非常糟糕的计划)。解决方案是避免由于规范化而导致表太多(例如,不要将2列拆分成单独的表),或者强制执行查询计划。后者显然是Bad Juju。

答案 1 :(得分:2)

Null会导致查询中的结果不正确和不一致,并且由于必须处理代码所需的特殊处理,通常会增加代码复杂性。出于这些原因,通常有必要避免或最小化数据库设计中的空值。您不需要在查询中使用空值 - 尽管SQL很难让它们很难避免。但是,通过不在基表中使用空值,您将确保数据模型更准确地反映现实,并且您将为数据库用户提供对如何使用空值的更多控制。

答案 2 :(得分:2)

正如dportas在评论中所暗示的那样,知道特定字段中的null值意味着什么 - 而不是理论上它意味着什么,但它在您的数据中意味着什么是有帮助的。

我认为只要您清楚null在您的表格中的含义,如果您确定它只意味着一件事,您就可以做出明智的务实决定允许它。

意见:我的经验法则是可空字段很好,但不应该是多任务

答案 3 :(得分:2)

Null对于拥有数据库至关重要。我从来没有处理过一个不允许空值的数据库,最终查询起来并不困难,维护起来要困难得多(你怎么决定什么价值意味着我不知道答案)并且通常有更多糟糕的数据。是nulls需要在查询中进行特殊处理,所以做一些事情,例如添加更晚的日期(1/1/9999)作为结束日期以避免出现空值。

事实是,在插入记录时,有些数据尚不清楚。没有替代null。

现在,在你的情况下,你应该突破到两个表,在表的宽度和查询那些可以为空的colulmns所需的频率上有很多。我不太可能将一个middlename列移动到另一个表,即使我有很多空值,因为它始终与基表中的其他信息一起查询。我也不太可能移动结束日期列。但是,如果列是那些在查询基础数据(例如生日,头发颜色等)时通常不会查询的事情,那么仅包含数据的记录的特殊表可能没问题。但请记住,当您查询是否使用内部联接时,将消除第二个表中没有值的所有记录。如果我通常想要所有记录(比如中间名,我很少只是为了找到中间名为'Mary'的人),那么我倾向于将它们保存在同一个表中,除非表格变得非常宽我通常不想查询该信息。