Oracle

在 Oracle 中不使用可為空數的原因?

  • September 7, 2012

我們公司正在與另一家軟體公司進行聯合項目的介面,我們被告知,如果不應該顯示特定值,我們應該傳入 -5000(他們的任意標記值);原因是他們的 Oracle 數據庫中沒有數字列支持空值,根據他們的(現在以前的)Oracle 開發人員的建議。這家公司還用 VB6 編寫了絕大多數程式碼(慢慢過渡到 VB.NET,這是另一天的另一個話題……)。出於純粹的好奇,這個建議有什麼正當理由嗎?我想不出任何站在我這邊的人。

    • 編輯

感謝大家的回饋。我在 CodeProject.com(連結)上提出了同樣的問題,並收到了非常相似的回饋。似乎唯一一次可能開始證明這種做法與外鍵有關,我可以說他們在系統中的任何地方都沒有使用外鍵。做出這個決定的開發人員(我曾經在那家公司工作)比我有更多的經驗,所以我想確保在嘲笑發生之前沒有正當的理由。

實際上,要求是瘋狂的。然而,就像所有偉大的瘋狂想法一樣,它可能是基於一些潛在的合理性,這些潛在的合理性被那些不了解其基本原理的人遠遠超出了上下文。

NULL設計一個不允許任何值的數據庫模式是合理的。但是,如果您這樣做,您將致力於標準化水平,其中每個非必需元素都被分解到一個單獨的表中,並帶有適當的外鍵引用返回到父級。在實踐中並不經常這樣做,但在有意義的情況下,可能會有好處。

如果您要設計一個不允許使用任何NULL值的數據庫模式,那麼允許使用是沒有意義的,更不用說要求使用魔法值來指示某些東西是未知的了。這引入了允許NULL值所帶來的所有問題,而且它添加了額外的程式碼來檢查必須在各處重複的魔法值。開發一個無論數據庫設計如何都需要傳入魔法值的 API 是沒有意義的——如果你要通過檢查魔法值來阻礙你的程式碼,你真的不應該讓這種瘋狂傳播到其他系統.

沒有使用魔法值而不是 NULL 的正當理由。這可能是某人製造這種混亂的思維過程。他們寫了這樣的東西:

SELECT c1, c2 FROM t1 WHERE c3 < 30;

當這沒有返回他們期望的結果時,他們意識到它不包含 NULL 並且需要這樣寫:

SELECT c1, c2 FROM t1 WHERE c3 < 30 OR c3 IS NULL;

他們不想寫或以後忘記寫這個,所以他們想出了使所有NULLS -5000的解決方案。神奇的是,他們的原始查詢無需任何更改即可處理 NULL。他們沒有意識到的是,現在想要排除這些值的人必須這樣寫:

SELECT c1, c2 FROM t1 WHERE c3 < 30 AND c3 <> -5000;

或者,如果他們想要這些值並且正在搜尋更高的範圍:

SELECT c1, c2 FROM t1 WHERE c3 > 40 OR c3 = -5000;

他們也可能沒有意識到以下內容將不再有意義:

SELECT c1, c2 FROM t1 WHERE c3 IS NULL;

相反,一個人必須記住神奇的價值。對於使用的每種數據類型,他們必須記住更多的魔法值,例如 1/1//1900、“Z”、-5000。此外,當魔術值在數據中時,他們還必須記住備用魔術值。

因此,對於一種特定情況,它以犧牲其他情況為代價使程式碼更簡單,更不用說磁碟空間、索引大小、查詢解析、一致性等了。

引用自:https://dba.stackexchange.com/questions/22940