如何最好地处理空数据库单元格?

4
如果我有一个包含许多空单元格的数据库表,最好的方法是什么(例如,不会降低性能,不会消耗内存,如果这可能的话)?
我知道有“null”值。是否有“none”值或等效项没有缺点?或者只是不填充单元格,那么它被认为是空的,因此没有剩余的事情要做吗?如果这是一个愚蠢的问题,请原谅。有时您不知道自己不知道的东西...
不想讨论规范化数据库。只是想知道空白/空/无单元格的常规智慧。
谢谢

使用 NULL。只有当超过半数的“单元格”为空时,您才需要关注性能问题——然后您需要考虑不同的数据表示方法。 - 9000
5个回答

4

使用 NULL。这就是它的作用。


4
惯例是使用null来表示缺失值。这就是SQL中null的目的。
著名数据库研究人员C.J. Date经常发表关于在逻辑层面上处理null的异议,他认为任何可能缺失的列都应该放在一个单独的表中,这样行的缺失对应着缺失值。
我不知道使用null是否会有严重的效率缺陷。任何特性的效率取决于您使用的具体数据库实现。您没有说您使用MySQL、Oracle、微软SQL Server还是其他产品。
例如,MySQL的InnoDB存储引擎不在行的列中存储null,只存储非null列。其他数据库可能会以不同的方式处理。同样地,索引中的null应该被高效处理,但这因产品而异。

使用Oracle db。我一直认为空值是最好的选择,直到看到了这篇文章:http://www.bennadel.com/blog/85-Why-NULL-Values-Should-Not-Be-Used-in-a-Database-Unless-Required.htm 没有数据库经验,不知道是否理解得全面。 - ggkmath
实际上,我的意图并不是表示“缺失”的值。相反,我的意图是表明没有数据存在。谢谢Bill! - ggkmath
2
NULL值只是数据的缺失。有些人没有中间名,数据库开发人员有时会使用空字符串来反映这一事实,将其与NULL区分开来,后者实际上什么也不显示。对于NULL,就像苏格拉底一样,你所知道的就是你不知道。 - Tim
@Tim:C.J. Date派系中的纯粹主义者会将所有人放在一个表中,但死亡日期列会放在另一个表中,对于尚未去世的人不会插入任何行。 - Bill Karwin
@Tim,是的,那是Codd的想法,将“缺失但适用”作为与“缺失且不适用”不同的状态。Date持不同意见,他认为在SQL中不应该有任何空值。单一空值方法可能是一种妥协。 :-) - Bill Karwin
显示剩余2条评论

1

通常说到数据库就是指行和列。 如果该列不需要值,则它将保持为空(又名 NULL),直到更新为值。 尽管并非所有数据库都具有NULL值,但这是大多数数据库的最佳实践--一些使用空字符串,但它们是例外。

关于空间利用率--如今磁盘相对便宜,因此对空间消耗的担忧不再像以前那样普遍,除了在庞大的数据库中。 如果您使用所有固定大小的数据类型,则可以从数据库中获得更好的性能,但是一旦您开始允许变量大小的字符串(例如varchar,nvarchar)类型,该优化就不再可能。

简而言之,在您涉足时,请不要担心性能,至少不要担心。


0

这是可能的,但需要考虑:

  1. 它们应该不为空吗?你是否应该实现 not null

  2. 这是一个工作流吗 -- 所以现在它们是空的,但将来大部分将被填写?

如果两个都是否定的,则可以考虑重新设计。编辑您的问题并发布您现在拥有的架构。


谢谢Damir!是的,空单元格应该是空的。它们只是在表中出现,因为一些其他列比其中包含空单元格的列更长。将来它们永远不会被填充。我目前正在思考/规划模式,这个问题浮现了。想知道把单元格留空是否有任何缺点。 - ggkmath
@ ggkmath,我不太明白--一个真实的例子会有帮助。 - Damir Sudarevic

0

这个问题有几种不同的看法。第一种是在数据未知时使用 null - 这就是它的作用。

第二种是不允许 null,要么将所有可能为空的字段分离到关系表中,要么创建“虚假”值来替换 null。对于 varchar,通常会使用空字符串,但问题在于日期字段或数字字段应该使用什么虚假值。然后,您必须编写代码来排除虚假数据,就像您必须编写代码来处理 null 一样。

个人而言,我更喜欢使用 null,并在数据确实是不同实体时将数据移动到子表中(通常这些字段最终需要父子关系结构的一对多结构,例如当您可能不知道一个人的电话号码时,将其放入单独的电话表中,然后您通常会发现需要存储多个电话号码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接