我有一個可空的winnerID
屬性,它不斷根據拍賣的競標進行更新。數據庫:我可以在第三個常規表單數據庫中具有可空屬性嗎?
此屬性設置爲最後保存以計算誰贏了拍賣。但是這個值最初是空的。
這會違反第三範式嗎?我知道1NF的第4條規定我不能具有可空屬性,但該說明表示這是一個有爭議的說法。
請您爲我澄清一下嗎?謝謝!
我有一個可空的winnerID
屬性,它不斷根據拍賣的競標進行更新。數據庫:我可以在第三個常規表單數據庫中具有可空屬性嗎?
此屬性設置爲最後保存以計算誰贏了拍賣。但是這個值最初是空的。
這會違反第三範式嗎?我知道1NF的第4條規定我不能具有可空屬性,但該說明表示這是一個有爭議的說法。
請您爲我澄清一下嗎?謝謝!
在SQL中定義空值的方式 - 作爲無法與域值進行比較的非值 - 意味着它們違反1NF(以及所有更高的法線形式)。關係(由規格化表格表示的數學結構)對於每一行的每一列必須具有單個值。空值意味着我們沒有值,可空列表示我們在一個表中有兩個關係 - 一個超類型關係,它包括除可爲空之外的所有列,以及具有相同主鍵和先前可空列的子類型關係,用於我們只能記錄屬性已知的行。規範化的目的是在不丟失信息的情況下將數據集分解爲基本事實,因此在單個表中有兩個關係與目標相矛盾,並使關係代數/演算等事情更加複雜。
正常形式是正式的邏輯定義結構,而不是工業最佳實踐,可以適應這種情況,所以我沒有看到太多的爭議空間。我們是否應該使用它們以及如何處理它們是一個更有趣的話題。
雖然nulls違反了常規形式,但並不意味着您不能在SQL數據庫中使用空值。他們有風險和好處。我也使用它們,但要考慮。
當人們說null不是一個值時,這是無稽之談;這只是一個經營者專門處理的價值。也就是說,當他們說SQL JOIN是連接時,這也是無稽之談,因爲它專門處理null。當他們說空值「意味着」像「那裏沒有值」或「沒有值爲已知值」之類的東西時,這也是無稽之談,因爲null在一行中出現的含義取決於表的*謂詞* (用於決定一行值是否屬於表格的成員函數)。 *有一個謂詞可以合理地描述*在那個表*中*的使用。 ... – philipxy
...但是要說這意味着這段時間是無稽之談,因爲對於無空表和無3VL運算符,輸出的謂詞是輸入謂詞的特定邏輯組合,我們依賴於瞭解查詢要求的行,但是在空值和3VL的情況下並非如此。在*特定查詢* *特定輸入*它可以是這樣的。 (我沒有解釋我們應該如何在nulls和3VL下正常化,我只是解釋說某些關於null的文章是無稽之談,因此無益,而基於它的推理/解釋/理由是無稽之談,並且沒有幫助。) – philipxy
我發現將空值視爲元數據更簡單。成爲一個價值意味着成爲某個運營商所定義的集合的成員。像平等這樣的操作符中的空值處理極大地使邏輯模型複雜化。將空值視爲物理模型構件而不是邏輯構件,使它們更容易理解和使用。 – reaanb