Relational-Theory
如何在數據庫模式中表達這個約束?
我在 BCNF 中有以下功能依賴項:
a,b -> c a -> d b -> d
有了額外的約束, no
a
andb
應該與 ac
、 wherea
和b
有不同d
的 s 結合。例子:
a | d b | d a | b | c ----- ----- --------- 1 | 3 5 | 3 1 | 5 | 6 2 | 4 2 | 5 | 7
第一行
a,b,c
是允許的 (1->3
,5->3
),但第二行是禁止的,因為 (2->4
,5->3
)4 != 3
。這個額外的約束會對我的數據產生兩個影響。對於每一個
a,b,c
,都有兩種冗餘的方法來確定d
. 可能存在違反約束的數據。我的模式如何反映這個額外的約束?
簡而言之,創建一個
ASSERTION
以確保在任何時候都不能違反業務規則,例如完全標準 SQL-92 語法:CREATE TABLE T1 ( a INTEGER NOT NULL, d INTEGER NOT NULL, UNIQUE (a, d) ); CREATE TABLE T2 ( b INTEGER NOT NULL, d INTEGER NOT NULL, UNIQUE (b, d) ); CREATE TABLE T3 ( a INTEGER NOT NULL, b INTEGER NOT NULL, c INTEGER NOT NULL, UNIQUE (a, b, c) ); CREATE ASSERTION no_a_and_b_should_be_combined_with_a_c_where_a_and_b_have_different_ds CHECK ( NOT EXISTS ( SELECT * FROM T3 WHERE NOT EXISTS ( SELECT T1.d FROM T1 WHERE T1.a = T3.a INTERSECT SELECT T2.d FROM T2 WHERE T3.b = T3.b ) ) );
壞消息是沒有商業(或其他?)SQL 產品支持
CREATE ASSERTION
.大多數工業級 SQL 產品都支持觸發器:可以在每個適用表的觸發器中實現上述功能。MS Access 是我所知道的唯一支持
CHECK
約束子查詢的商業產品,但我不認為它具有工業強度。還有進一步的解決方法,例如強制使用者僅通過儲存過程更新表,這些儲存過程可以證明永遠不會使數據庫處於非法狀態。