小编典典

创建数据库表NULL最佳实践

sql

当我只有一个表时(其中有时仅填充两个字段,在行中创建许多NULL值),不确定使用NULL值的最佳实践是什么。

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

跨这两个表的联接只会返回一个结果,该结果等于我的原始表与NULL的值,那么这有什么意义呢?

似乎没有必要将它们分开,但是我一直在阅读一些有关避免在数据库中一起使用null的知识。

任何想法欢迎。


阅读 319

收藏
2021-03-17

共1个答案

小编典典

  1. 从理论上讲,NULL应该表示“未知值”。因此-再一次,纯粹从理论上讲-您应该在规范化时设计表,这样就不必填写NULL值来表示“不适用于此行”。但是,这一点与任何实际考虑(设计,性能或查询可读性)几乎没有关系。

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

    • 缩短表(从IO方式和/或从空间角度而言)会带来实质性的好处。NULL确实占用空间,并且行越宽,性能越差。当表有很多行并且有许多这样的稀疏列时,尤其如此。对于只有2个这样的列的较小表,实现的好处可能不值得拥有额外的联接的麻烦。

    • 您的查询在WHERE子句中有问题的列。IIRC,在具有大量NULL的列上查询效率很低。

    • 另一方面,在某些时候,查询中有多余的联接可能会损害优化器的性能(至少在Sybase联接具有10个以上的表时,它会对Sybase造成影响-从优化器运行时占用CPU资源到实际使优化器混淆选择一个非常糟糕的计划)。解决方案是避免由于规范化而导致表太多(例如,不要费心将2列拆分为单独的表),或者避免执行查询计划。后者显然是Bad Juju。

2021-03-17