gpt4 book ai didi

sql - 从数据库模型中消除可空列的选项(为了避免 SQL 的三值逻辑)?

转载 作者:行者123 更新时间:2023-12-04 04:13:56 28 4
gpt4 key购买 nike

前段时间,我一直在读这本书SQL and Relational Theory by C. J. Date .作者以批评 SQL 的三值逻辑(3VL)而闻名。 1)

作者强调了为什么在 SQL 中应该避免 3VL,但他没有概述 如果不允许可空列,数据库模型会是什么样子 .我已经考虑了一点,并提出了以下解决方案。如果我错过了其他设计选项,我想听听他们的消息!

1) Date 对 SQL 3VL 的批评反过来也受到了批评:参见 this paper by Claude Rubinson (包括 C. J. Date 的原始评论)。


示例表:

以下表为例,我们有一个可为空的列 ( DateOfBirth ):

#  +-------------------------------------------+
# | People |
# +------------+--------------+---------------+
# | PersonID | Name | DateOfBirth |
# +============+--------------+---------------+
# | 1 | Banana Man | NULL |
# +------------+--------------+---------------+

选项 1:模拟 NULL通过标志和默认值:

不是使列可以为空,而是指定任何默认值(例如 1900-01-01 )。附加 BOOLEAN列将指定是否在 DateOfBirth 中的值应该简单地被忽略或者它是否真的包含数据。
#  +------------------------------------------------------------------+
# | People' |
# +------------+--------------+----------------------+---------------+
# | PersonID | Name | IsDateOfBirthKnown | DateOfBirth |
# +============+--------------+----------------------+---------------+
# | 1 | Banana Man | FALSE | 1900-01-01 |
# +------------+--------------+----------------------+---------------+

选项 2:将可为空的列转换为单独的表:

可为空的列替换为新表 ( DatesOfBirth )。如果记录没有该列的数据,则新表中不会有记录:
#  +---------------------------+ 1    0..1 +----------------------------+
# | People' | <-------> | DatesOfBirth |
# +------------+--------------+ +------------+---------------+
# | PersonID | Name | | PersonID | DateOfBirth |
# +============+--------------+ +============+---------------+
# | 1 | Banana Man |
# +------------+--------------+

虽然这似乎是更好的解决方案,但这可能会导致需要为单个查询连接多个表。自 OUTER JOIN s 将不被允许(因为它们会在结果集中引入 NULL),所有必要的数据可能不再像以前一样仅通过单个查询即可获取。

问题:
是否有其他选项可以消除 NULL (如果有,它们是什么)?

最佳答案

我看到 Date 的同事 Hugh Darwen 在一个出色的演示文稿“如何在不使用 NULL 的情况下处理丢失的信息”中讨论了这个问题,该演示文稿可在 the Third Manifesto website 上获得。 .

他的解决方案是您第二种方法的变体。这是第六范式,其中包含出生日期和未知标识符的表格:

#  +-----------------------------+ 1    0..1 +----------------------------+
# | People' | <-------> | DatesOfBirth |
# +------------+----------------+ +------------+---------------+
# | PersonID | Name | | PersonID | DateOfBirth |
# +============+----------------+ +============+---------------+
# | 1 | Banana Man | ! 2 | 20-MAY-1991 |
# | 2 | Satsuma Girl | +------------+---------------+
# +------------+----------------+
# 1 0..1 +------------+
# <-------> | DobUnknown |
# +------------+
# | PersonID |
# +============+
# | 1 |
# +------------+

然后从 People 中选择需要加入所有三个表,包括指示未知出生日期的样板。

当然,这有点理论化。现在的 SQL 状态仍然不够先进,无法处理所有这些。 Hugh 的演讲涵盖了这些缺点。他提到的一件事并不完全正确:某些风格的 SQL 确实支持多重赋值——例如 Oracle's INSERT ALL syntax .

关于sql - 从数据库模型中消除可空列的选项(为了避免 SQL 的三值逻辑)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079885/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com