Normalization
如何確保在不失去數據的情況下拆分錶?
這是 wrt 數據庫規範化,當我有一個導致異常的冗餘表時,我會考慮根據 NF 規則將其拆分為較小的表。
但
假設我將一張大桌子分成兩部分,例如。學生和分數表我的問題是——
我怎麼知道我做了正確的拆分?
或者換一種說法,
我如何交叉檢查拆分後我是否沒有失去任何資訊,即我仍然可以在兩個表上進行連接並取回我的非規範化表?
當您擁有少量屬性時,這很容易直覺地檢查,但如果表真的很大怎麼辦。
如何確保以正確的方式拆分錶格?
當我在大學時,我的教授談到了一些等式,無論何時拆分錶都必須始終為真,以確保拆分完成時不會失去任何資訊。通過進行正確的連接,我們可以恢復大而臟的冗餘表。
正規化理論中的一個經典定理說,在兩個關係的情況下,當且僅當關係屬性的交集包含兩個關係之一的候選鍵。
這個結果可以推廣到具有任意數量關係的分解。
使用連接,嘗試準確地重建原始數據。如果您的 DBMS 支持它,我建議使用 EXCEPT:
IF EXISTS ( SELECT * FROM A EXCEPT SELECT * FROM B UNION ALL SELECT * FROM B EXCEPT SELECT * FROM A ) PRINT 'There is a problem'
注意:列必須匹配,在這種情況下 NULL 將等於 NULL