2016-11-13 3 views
1

私は製品と呼ばれるテーブルとカテゴリと呼ばれるテーブルを持っています、そして、私はそれぞれの製品が少なくとも1つのカテゴリーと2つまでのカテゴリを持っていなければならないと言いたいので、私が正しいと言えば1..Nの製品--- --- 1..2カテゴリの権利?ここで最も重要な問題は、この基数をどのように作るかです。私はSQLでそれを作るか、私はちょうどサーバーコード(ロジック)でそれを作るのですか?私はここで、または共同テーブルが必要ですか?カーディナリティを設計からコード化する方法は?

申し訳ありませんが私の質問は悪いですが、この問題は私のプロジェクトを進展させていません。

ありがとうございます。

答えて

0

リレーショナルモデルとSQL標準は、この種の要求をアサーションでサポートします。しかし、AFAIKは、現在出荷しているSQL製品はCREATE ASSERTIONをサポートしていません。

この種のコードは、製品ごとに2つ以上のカテゴリが存在しないという要件を強制します。

create table product_categories (
    product_code char(1) not null, -- references products (product_code), not shown 
    category_num integer not null 
    default 1 
    check (category_num in (1, 2)), 
    category varchar(10) not null, 
    primary key (product_code, category) 
); 

insert into product_categories values 
('a', 1, 'wire'), 
('a', 2, 'cable'), 
('b', 1, 'panel'), 
('b', 2, 'plate'); 

「category_num」を1または2以外に挿入すると、エラーが発生することは明らかです。したがって、各製品コードは2つ以上のカテゴリを持つことはできません。

各製品に少なくとも1つのカテゴリが必要であるという制約を適用するには、手順コードを記述する必要があります。トリガまたはストアドプロシージャのいずれかが機能します。


Oracleに宣言型アサーションを追加することについての議論:SQL Assertions/Declarative multi-row constraints

+0

あなたの答えは素晴らしいですが、私はコードでそれを作る場合は、たとえば、私は、クエリは、この製品が含まれている場合どのように多くのカテゴリをチェックして行った場合出力は2行ですが、私は製品がより多くのことを許していません。逆も同様です...これは良いか悪い方法ですか? –

+0

通常は、エラーがあれば挿入してトラップし、適切な処置をとるだけです。とにかくエラーをトラップする必要があります。すでに2つの行があるだけでなく、間違っていることがたくさんあります。 (私はストアドプロシージャでそれをやっていました。自分自身で、すべての挿入と削除がストアドプロシージャを通過するように要求しています) –

+0

助けてくれてありがとう:D –

関連する問題