Sql-Server

sql_variant 是否與第一範式 (1NF) 兼容?

  • August 5, 2018

1NF 規則說我們不應該將不同類型的數據保存在一列中。這是否意味著 sql_variant 與第一範式不兼容,因此不應使用?

1NF 規則說我們不應該將不同類型的數據保存在一列中。

關於第一範式(1NF) 的具體含義尚無普遍共識。就個人而言,我更喜歡 Chris Date 目前的解釋,它簡單地說明所有關係變數(relvars)根據定義都在 1NF 中。

這是否意味著 sql_variant 與第一範式不兼容,因此不應使用?

這有點不精確,因為範式是邏輯模型的屬性,而是sql_variant物理(SQL Server 特定)類型。我們需要定義從關係模型類型(或域)到物理實現的映射才能真正有意義。

儘管如此,我會說這本質sql_variant上並不表明相關模型違反了 1NF——只要模型定義了允許的屬性值範圍以匹配那些可儲存的值(有或沒有合適的約束)。可以儲存幾種不同基礎類型的值的事實既不存在也不存在。我們不妨爭辯說浮點類型違反了 1NF,因為它們可以包含整數以及實數等。sql_variant``sql_variant

換句話說,使用的物理表sql_variant 可以是關係變數的有效表示(無論如何都在 SQL 的一般限制範圍內)。它僅取決於底層邏輯模型對屬性中允許的值範圍的說明。

還要考慮我們可能物理儲存在 a 中的任何內容也可能sql_variant儲存在字元串表示形式中,或者作為二進制值。字元串和二進制值不一定違反 1NF,那麼為什麼要違反 1NF sql_variant?可以對xmlor json(以及支持此類事物的數據庫的數組類型)提出類似的論點。

以上所有內容都與使用是否sql_variant是“良好”設計/實現的特徵的問題正交。

進一步閱讀:

腳註

在關係數學中,某些領域可能將關係作為元素。如果將這樣的域用作另一個關係中屬性的基礎,則結果將不是 Codd 最初所說的範式。在不降低模型的表達能力的情況下從考慮中刪除這些關係是重點。如前所述,Relvars 根據定義消除了這種嵌套。初學者通常通過將 CSV 字元串儲存在列中來繞過物理設計的限制。這種設計對數據的密鑰訪問會產生影響。

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