oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...
不久之前,我一直在閱讀
SQL and Relational Theory by C. J. Date一書(shū).作者因批評(píng)sql的三值邏輯(3VL)而聞名.1)
作者強(qiáng)調(diào)了為什么在sql中應(yīng)該避免使用3VL,但他沒(méi)有概述如果不允許使用可空列的數(shù)據(jù)庫(kù)模型的樣子.我已經(jīng)考慮了一下,并提出了以下解決方案.如果我錯(cuò)過(guò)了其他設(shè)計(jì)方案,我想聽(tīng)聽(tīng)他們的意見(jiàn)!
1)日期對(duì)sql 3VL的批評(píng)反過(guò)來(lái)也受到批評(píng):見(jiàn)this paper by Claude Rubinson(包括C. J. Date的原始批評(píng)).
示例表:
作為示例,請(qǐng)使用下表,其中我們有一個(gè)可為空的列(DateOfBirth):
# +-------------------------------------------+
# | People |
# +------------+--------------+---------------+
# | PersonID | Name | DateOfBirth |
# +============+--------------+---------------+
# | 1 | Banana Man | NULL |
# +------------+--------------+---------------+
選項(xiàng)1:通過(guò)標(biāo)志和默認(rèn)值模擬NULL:
不是使列可為空,而是指定任何默認(rèn)值(例如1900-01-01).另一個(gè)BOOLEAN列將指定是否應(yīng)該簡(jiǎn)單地忽略DateOfBirth中的值或者它是否實(shí)際包含數(shù)據(jù).
# +------------------------------------------------------------------+
# | People' |
# +------------+--------------+----------------------+---------------+
# | PersonID | Name | IsDateOfBirthKnown | DateOfBirth |
# +============+--------------+----------------------+---------------+
# | 1 | Banana Man | FALSE | 1900-01-01 |
# +------------+--------------+----------------------+---------------+
選項(xiàng)2:將可為空的列轉(zhuǎn)換為單獨(dú)的表:
可空列由新表(DatesOfBirth)替換.如果記錄沒(méi)有該列的數(shù)據(jù),則新表中將不會(huì)有記錄:
# +---------------------------+ 1 0..1 +----------------------------+
# | People' | | DatesOfBirth |
# +------------+--------------+ +------------+---------------+
# | PersonID | Name | | PersonID | DateOfBirth |
# +============+--------------+ +============+---------------+
# | 1 | Banana Man |
# +------------+--------------+
雖然這似乎是更好的解決方案,但這可能會(huì)導(dǎo)致需要為單個(gè)查詢加入許多表.由于不允許OUTER JOIN(因?yàn)樗鼈儠?huì)在結(jié)果集中引入NULL),所以可能不再像以前那樣只使用一個(gè)查詢來(lái)獲取所有必需的數(shù)據(jù).
題:
是否有其他選項(xiàng)可以消除NULL(如果是,它們是什么)?
總結(jié)
以上是生活随笔為你收集整理的oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【django学习】request.PO
- 下一篇: python中的匿名函数lambda