Relational-Theory

如何在數據庫模式中表達這個約束?

  • October 29, 2018

我在 BCNF 中有以下功能依賴項:

a,b -> c
a -> d
b -> d

有了額外的約束, no a​​andb應該與 a c、 whereab有不同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約束子查詢的商業產品,但我不認為它具有工業強度。還有進一步的解決方法,例如強制使用者僅通過儲存過程更新表,這些儲存過程可以證明永遠不會使數據庫處於非法狀態。

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