2016-02-28 103 views

回答

3

在SQL中定義空值的方式 - 作爲無法與域值進行比較的非值 - 意味着它們違反1NF(以及所有更高的法線形式)。關係(由規格化表格表示的數學結構)對於每一行的每一列必須具有單個值。空值意味着我們沒有值,可空列表示我們在一個表中有兩個關係 - 一個超類型關係,它包括除可爲空之外的所有列,以及具有相同主鍵和先前可空列的子類型關係,用於我們只能記錄屬性已知的行。規範化的目的是在不丟失信息的情況下將數據集分解爲基本事實,因此在單個表中有兩個關係與目標相矛盾,並使關係代數/演算等事情更加複雜。

正常形式是正式的邏輯定義結構,而不是工業最佳實踐,可以適應這種情況,所以我沒有看到太多的爭議空間。我們是否應該使用它們以及如何處理它們是一個更有趣的話題。

雖然nulls違反了常規形式,但並不意味着您不能在SQL數據庫中使用空值。他們有風險和好處。我也使用它們,但要考慮。

+0

當人們說null不是一個值時,這是無稽之談;這只是一個經營者專門處理的價值。也就是說,當他們說SQL JOIN是連接時,這也是無稽之談,因爲它專門處理null。當他們說空值「意味着」像「那裏沒有值」或「沒有值爲已知值」之類的東西時,這也是無稽之談,因爲null在一行中出現的含義取決於表的*謂詞* (用於決定一行值是否屬於表格的成員函數)。 *有一個謂詞可以合理地描述*在那個表*中*的使用。 ... – philipxy

+0

...但是要說這意味着這段時間是無稽之談,因爲對於無空表和無3VL運算符,輸出的謂詞是輸入謂詞的特定邏輯組合,我們依賴於瞭解查詢要求的行,但是在空值和3VL的情況下並非如此。在*特定查詢* *特定輸入*它可以是這樣的。 (我沒有解釋我們應該如何在nulls和3VL下正常化,我只是解釋說某些關於null的文章是無稽之談,因此無益,而基於它的推理/解釋/理由是無稽之談,並且沒有幫助。) – philipxy

+1

我發現將空值視爲元數據更簡單。成爲一個價值意味着成爲某個運營商所定義的集合的成員。像平等這樣的操作符中的空值處理極大地使邏輯模型複雜化。將空值視爲物理模型構件而不是邏輯構件,使它們更容易理解和使用。 – reaanb

相關問題