sql - 创建数据库表 NULL 最佳实践

标签 sql database database-design null

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

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

这两个表之间的连接只会返回一个结果,该结果等于我的原始表中的 NULL,那有什么意义呢?

将它们分开似乎毫无意义,但我一直在阅读一些关于避免在数据库中一起使用 null 的内容。

最佳答案

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

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

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

    • 您的查询在 WHERE 子句中有相关列。 IIRC,在严重为 NULL 的列上查询效率相当低。

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

关于sql - 创建数据库表 NULL 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4431182/

相关文章:

sql - Ms Access 连接不同数据库中的表

具有软删除、唯一键和外键约束的 MySQL

sql - 存储用于分页的 SQL Server 查询结果

database - Django 仅基于日期过滤日期时间

sql-server - 主键的 Sql 数据类型 - SQL Server?

mysql - 有更好的方法吗? MySQL

Mysql 查询基于该列的列组中的值的总和

Python:如何检查一个条目是否已经存在于sql数据库中?

mysql - 从sql IF中选择一个字段,否则选择另一个字段

mysql - SQL - 为同一城市的员工获取配对,并且配对中的第一个员工参加了第二个员工教授的类(class)