基本的に、私が行ったことは、Program、Channel、Ident、および CommunicationType の 4 つのテーブルを作成して、これらのそれぞれに関する情報を格納することでした。
それは良い考えです。
(Program, Channel)、(Program, Identifier) などのジャンクション テーブルを作成すると設計が複雑になるだけでなく、これら 4 つのテーブルの主キーで構成される単一のテーブルを作成し、(Program, Channel) に一意の制約を適用しました。チャネル、Ident、CommunicationType)。
このようなテーブルを設計する場合、1 つのことに注意する必要があります。キー {Program, Channel, Ident, CommunicationType} を持つ構造では、Program と Channel、Channel と Ident、Program と 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 列の主キーを持つテーブルは、その理由だけで通常の形式に違反することはありませんが、他の理由による場合もあります。既知のすべての制約を実装できないことは、通常、最適化されていない設計ですが、通常の形式に違反しているからではありません。