【问题标题】:How to differentiate between unknown and known absence of information如何区分未知和已知的信息缺失
【发布时间】: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 来表示一个开放的结尾

标签: sql database null


【解决方案1】:

评论太长了。

“最佳实践”取决于上下文和整体数据模型。有很多不同的方法:

  • 使用“神奇”的非 NULL 值。
  • 使用单独的 boolean/tinyint 列。
  • 使用 EAV(实体-属性-值)模型。
  • 将值存储为 JSON 或 XML(类似于您的 NOSQL 方法)。

(当然还有其他方法。)

对于您使用中间名的示例,我发现很难想象有人知道有中间名但不知道名字(或首字母)的情况。所以,NULL 似乎很合适。 这适用于电话号码、电子邮件地址、首选敬语等。

在实践中,我认为这不是一个主要问题。 NULL 似乎适用于大多数列。诚然,有一些情况,但这种情况相当罕见。

【讨论】:

    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2019-05-07
    相关资源
    最近更新 更多