5

図を説明します。

2 つのエンティティ: E1 & E2

カーディナリティ:

-E1 から E2 へ (リレーション R 経由): (6,50)

-E2 から E1 へ (リレーション R 経由): (3,5)

 ______               ^              ______
|  E1  |___(6,50)____/R\____(3,5)___|  E2  |
|______|             \ /            |______|
                      v

カーディナリティを強制することになっていますが、この本では ASSERTION の詳細についてはあまり掘り下げていません。これは、カーディナリティを強制する正しい方法でしょうか?

CREATE ASSERTION assert
CHECK ( (SELECT COUNT(E1.ID) FROM E1) >= 6  AND 
        (SELECT COUNT(E1.ID) FROM E1) <= 60 AND 
        (SELECT COUNT(E2.ID) FROM E2) >= 3  AND 
        (SELECT COUNT(E2.ID) FROM E2) <= 5 );
4

1 に答える 1

3

アサーションを実装した DBMS は知りません。構文はMimer オンライン SQL-92 構文検証ツールで確認できます。

CREATE ASSERTION assertion_R
  CHECK ( NOT EXISTS
            ( SELECT * 
              FROM E1 
                LEFT JOIN R
                  ON R.e1_id = E1.id
              GROUP BY E1.id
              HAVING COUNT(R.e1_id) NOT BETWEEN 6 AND 60
            )
       AND NOT EXISTS
            ( SELECT * 
              FROM E2 
                LEFT JOIN R
                  ON R.e2_id = E2.id
              GROUP BY E2.id
              HAVING COUNT(R.e2_id) NOT BETWEEN 3 AND 5
            ) 
        ) ;
于 2012-10-11T18:16:33.703 に答える