2011-07-02 7 views
0

次のデザインパターンが受け入れられるかどうかはわかりません。ジャンクションテーブルと正規化の質問

1)アプリケーション(例えばAppAAppBAppC)を表すことができなければならない、属性のそれ自身のセットをそれぞれ1:私は、次の要件(および他のいくつかのより多くの)リレーショナルモデルのために持っています。

2)すべてのアプリケーションは、Internet(Eメール、Twitter、Facebook)、Phone(SMS、MMSなど)のような異なるチャンネルで通信できるため、プログラムとチャンネルの間に多対多の関係があります。

3)あらかじめ定義された識別子(アドレス、電話番号、ログインアカウント)は多くのプログラムで共有できるため、プログラムと識別子の間に多対多の関係があります。

4)同じ識別子でいくつかのタイプのメッセージを送信できるので、プログラムも(多対多)可能ですが、アプリケーションごとに通信タイプの識別子の使用を制限できる必要があります基礎。

基本的に、私がやったことは、これらのそれぞれについての情報を格納するための4つのテーブル、ProgramChannelIdentCommunicationTypeを作成することだったと、その代わり、(Program, Channel)ため(Program, Identifier)を接合テーブルを作成する、などこれにちょうど設計が複雑になります私は(Program, Channel, Ident, CommunicationType)にユニーク制約を持つこれらの4つのテーブルの主キーで構成される単一のテーブルを作成しました。今、このテーブルの各レコードは、所定の通信にリンクされています。

もちろん、これは私の問題をかなり簡単に解決しますが、正規化の原則を破ってもこれが受け入れられるかどうかは疑問です。誰も私に意見を与えてくれますか?

答えて

1

基本的に、私がやったことは罰金でしょうこれらのそれぞれと、

について 情報を保存するために 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列の主キーを持つ表は、その理由だけで通常の書式に違反しません。それ以外の理由ででもかまいません。すべての既知の制約を実装することができないのは一般的に、準最適設計ですが、通常の形式に違反しているわけではありません。

+0

+1。あなたの答えをありがとう!私はこのデザインに従うつもりだと思う。あなたは正しい、私は '{Program、Ident、CommunicationType'のすべての組み合わせが有効ではないことを意味しました。また、{Channel、Program}のキーを設定する必要があります。そのため、デザインに感謝します。 – User

1

ご連絡いただきありがとうございます。詳細はお問い合わせください。この時点で私の評判はコメントができません...

説明に基づいて、選択したデザインに何も間違いはありません。

しかし、あなたの質問に本当に答えるには、なぜこのデザインを選んだのかを理解することは有益でしょう。

結局のところ、すべてのキーと複合ユニークインデックスを持つ単一のテーブルなしでも機能します。すべての組み合わせをこのようにロックすることは、むしろ制限的です。

コミュニケーションが見つかったら、コミュニケーションを構成する情報にアクセスするために、1つ以上の他のテーブルに参加する必要があります。

なぜこのように各固有の通信パスを保存したいのですか?

+0

+1。あなたの答えをありがとう!私の目標は、冗長な情報をどこにも格納しないことです。そのため、テーブル間のジョインに本当に依存しています。 – User

1

私はこれをしません。

私はテーブルの各ペア(またはnタプル)の間に1つの接合テーブルを作成します。これにより、最終的に簡単にクエリを実行できるようになります。また、必要に応じて行をそれぞれの場合とは独立して適切な方法で制約することもできます。

これらのジャンクションには、ソフトウェアごとに、方向性、ペイロード、使用される言語、クエリポイントにアクセスするなどの追加の属性が必要な場合があります。

+0

+1。あなたは正しいです、今私はこれが良い考えではないことがわかります。どうもありがとうございます。 – User

関連する問題