oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...

不久之前,我一直在阅读

SQL and Relational Theory by C. J. Date一书.作者因批评sql的三值逻辑(3VL)而闻名.1)

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

1)日期对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(因为它们会在结果集中引入NULL),所以可能不再像以前那样只使用一个查询来获取所有必需的数据.

题:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值