域鍵範式

資料庫規範化的一個級別

關係數據庫設計的域鍵範式 (Domain-key normal form, DK/NF),是數據庫規範化的一個級別,以去除關係不包含於域約束(domain constraint)的其他約束。

域約束指出給定屬性的取值範圍。鍵約束指出這幾個屬性唯一確定了表中的一行。

域鍵範式使得一個關係的所有約束都是鍵與域(domain)定義的邏輯蘊涵;因而執行對鍵與域上的限制與條件後,將導致所有的約束都滿足。滿足域鍵範式,使得數據庫避免了不是清晰的域約束或鍵約束的一般性約束。這種一般性約束往往需要特殊編程(如存儲過程)來檢驗是否滿足。

第三範式BC範式第四範式第五範式是域鍵範式的特例。因為函數依賴、多值依賴與連接(join)依賴都可以轉換為(超)鍵。這些範式對域約束沒有討論,可看作沒有域約束。

例子

下表違反了DKNF:

Wealthy Person
(富人)
Wealthy Person
(富人)
Wealthy Person Type
(富人類型)
Net Worth in Dollars
(美元淨值)
Steve Eccentric Millionaire 124,543,621
Roderick Evil Billionaire 6,553,228,893
Katrina Eccentric Billionaire 8,829,462,998
Gary Evil Millionaire 495,565,211

(假定富人屬性包括了預定集樣本集中所有富人的名字;富人類型屬性取值為'Eccentric Millionaire', 'Eccentric Billionaire', 'Evil Millionaire', 'Evil Billionaire';美元淨值屬性取值為大於等於1,000,000的整數)

在富人類型屬性與美元淨值屬性之間存在約束,即使不能從一個屬性推得另一個屬性:Eccentric Millionaire或Evil Millionaire的美元淨值應在1,000,000 到 999,999,999,而Eccentric Billionaire或Evil Billionaire的美元淨值應大於等於1,000,000,000。該約束既不是域約束(domain constraint)也不是鍵約束(key constraint)。因為不能用域約束或鍵約束來保證表中不出現不一致的Wealthy Person Type / Net Worth。

違反DKNF的問題可把Wealthy Person Type屬性域改為兩個值:'Evil'與'Eccentric',而百萬富翁還是十億富翁的狀態可通過Net Worth in Dollars屬性確定,因此沒有損失信息。

Wealthy Person
Wealthy Person Wealthy Person Type Net Worth in Dollars
Steve Eccentric 124,543,621
Roderick Evil 6,553,228,893
Katrina Eccentric 8,829,462,998
Gary Evil 495,565,211
Wealthiness Status
(財富狀況)
Status
(狀況)
Minimum
(最少)
Maximum
(最多)
Millionaire 1,000,000 999,999,999
Billionaire 1,000,000,000 999,999,999,999

外鍵

表之間的關係(Relationships)如果不能表示為外鍵,顯然違反域鍵範式。例如,"Parent ID"屬性可以指向幾張表中的某個,這取決於另外的屬性"Parent Type", 這違反了DKNF.


參見

參考文獻

外部連結