【发布时间】:2020-02-12 03:49:37
【问题描述】:
上下文
-
NULL经常被混为一谈,既表示未知数据又表示已知数据缺失 - 在聚合中(例如
DATEs 或更糟的DATETIMEs),稀疏数据必须用魔术值表示
示例
- 一个人的中间名
- 没有中间名的人与不知道中间名的人相比
- 某人的出生日期和时间
- 区分根本不知道的时间与系统不知道的时间
- 知道某人的出生月份和日期,但不知道年份
其他想法、背景和/或方法
- 如果这是一个 NoSQL 上下文,则可以有一个“规则”,即如果已知字段不存在,则根本不存储它,如果未知,则存储为
null- 如果规则翻转,这可能更有意义
- 可以分解聚合并将规则应用于各个字段
- 我承认我对 NoSQL 领域一无所知,但似乎这很容易出错
- 无论好坏,这不适用于 SQL 数据库;省略号和
NULL是一样的
- 任何未知或不存在的字段都可以有一个关联的
BOOLEAN字段来说明它是否不存在- 这是唯一对我来说似乎防弹的方法
- 似乎可以扩展到所有领域
- 至少看起来非常乏味
- 一些“特殊值”(或值,因为有各种类型)来表示差异
- 对于文本字段,可能是
my-application/unknown和/或my-application/absent(或选择NULL之一) - 不可能毫不含糊地强制执行(例如,如果在 Unix 时间选择
42,那也是1970-01-01T00:00:42+00:00)
- 对于文本字段,可能是
问题
处理未知数据和已知数据缺失之间差异的最佳做法是什么?
【问题讨论】:
-
“未知数据和已知数据缺失之间的区别”——我从来不用处理这个问题。如果没有数据,就没有数据。我真的不在乎为什么它是“未知的”。这可能会产生影响的唯一情况是定义范围的列,例如开始日期/结束日期。但是我更喜欢使用
infinity而不是null来表示一个开放的结尾