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(如果是,它們是什么)?
總結
以上是生活随笔為你收集整理的oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【django学习】request.PO
- 下一篇: python面试总结(五)内存管理与MY