sql_variant 是否與第一範式 (1NF) 兼容?
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,那麼為什麼要違反 1NFsql_variant
?可以對xml
orjson
(以及支持此類事物的數據庫的數組類型)提出類似的論點。以上所有內容都與使用是否
sql_variant
是“良好”設計/實現的特徵的問題正交。進一步閱讀:
- Anith Sen關於第一範式的事實和謬誤
- Fabian Pascal理論與實踐中的第一範式
- 第三次宣言- CJ 伊達和休·達爾文
- 第一範式:明確定義(Q & A)
腳註
在關係數學中,某些領域可能將關係作為元素。如果將這樣的域用作另一個關係中屬性的基礎,則結果將不是 Codd 最初所說的範式。在不降低模型的表達能力的情況下從考慮中刪除這些關係是重點。如前所述,Relvars 根據定義消除了這種嵌套。初學者通常通過將 CSV 字元串儲存在列中來繞過物理設計的限制。這種設計對數據的密鑰訪問會產生影響。