基本的に、私がやったことは罰金でしょうこれらのそれぞれと、
について 情報を保存するために 4つのテーブル、プログラム、チャンネル、のIdent とCommunicationTypeを作成することでした。代わりに、(プログラム、チャネル)のための接合テーブル を作成(プログラム、 識別子)、及びのでその上 だけ設計が複雑になると、私は にの 主キーからなる単一のテーブルを作成
これらの4つのテーブルは (Program、 Channel、Ident、CommunicationType)の一意の制約付きです。
このような表を設計するときは、1つのことに注意する必要があります。 {Program、Channel、Ident、CommunicationType}というキーを持つ構造は、プログラムとチャネル、チャネルと識別子、プログラムと通信タイプなどのすべての組み合わせを可能にします。時にはそれは悪い考えです。
同じ識別子は、メッセージのいくつかの タイプを送る、というように入力し プログラム(再び、多対多)することができますが、私はコミュニケーションのために 識別子の使用を制限できるようにする必要があります ことができますアプリケーションごとに
これが悪い考えです。 Ident、Program、およびCommunicationsTypeのすべての組み合わせが有効であるとは限りません。
有効な組み合わせは、それぞれのテーブルに格納します。外部キー参照を使用してデータの整合性を維持する。
キー{Program、Ident、CommunicationsType}を持つテーブルを作成します。キー{Program、Channel、Ident、CommunicationType}を持つテーブルは、それに対する外部キー参照を設定できます。
知っているすべての制約を実装するのに必要な数だけテーブルを作成します。テーブルを増やすと、データの整合性チェックが簡単になります。 (2つの列を持つ必要があると仮定しないでください。もっと必要な場合があります)
{Program、Channel}のキーが必要です。しかし、そうしたら、これらの線に沿ってテーブルを作成する必要があります。 (航空コード)
create table pc (
program_name varchar(10) not null references programs (program_name),
channel_name varchar(10) not null references channels (channel_name),
primary key (program_name, channel_name)
);
create table pict (
program_name varchar(10) not null,
channel_name varchar(10) not null,
comm_type varchar(10) not null references communication_type (comm_type),
primary key (program_name, channel_name, comm_type),
foreign key (program_name, channel_name)
references pc (program_name, channel_name)
);
create table your-table-name (
program_name varchar(10) not null,
channel_name varchar(10) not null,
comm_type varchar(10) not null,
ident varchar(10) not null,
primary key (program_name, channel_name, comm_type, ident),
foreign key (program_name, channel_name, comm_type)
references pict (program_name, channel_name, comm_type),
foreign key (ident) references ident (ident)
);
必要に応じて他の列を追加します。場合によっては、重複する外部キーが必要になることがあります。私はあなたがここにそれらを必要とは思わないが、私は間違っている可能性があります。
「正規化の原則を破った場合」とは何を意味するのかよく分かりません。 4列の主キーを持つ表は、その理由だけで通常の書式に違反しません。それ以外の理由ででもかまいません。すべての既知の制約を実装することができないのは一般的に、準最適設計ですが、通常の形式に違反しているわけではありません。
+1。あなたの答えをありがとう!私はこのデザインに従うつもりだと思う。あなたは正しい、私は '{Program、Ident、CommunicationType'のすべての組み合わせが有効ではないことを意味しました。また、{Channel、Program}のキーを設定する必要があります。そのため、デザインに感謝します。 – User