0

アプリケーションデータベースを設定していて、外部キーを設定するのに苦労しています。基本的な設計には、ユーザー、クライアント、contact_mapの3つのテーブルがあります。ユーザーにはクライアントがあります。ユーザーとクライアントの両方に複数の電話と電子メールアカウントがあります。連絡先マップにはそれらが保持されます。 UserID、UserType、Key、Valueを持っています。MySQL - コンポジットパターンで外部キーを設定する(複数のテーブルを1つのマップにマッピングする)

UserID =クライアントまたはユーザーテーブルのID。 UserType = enum( 'user'、 'client') Key/value =電話番号または電子メールアドレスのキーと値のペア。

私は可能なことをしようとしていますが、もしそうなら、どうやってそれをしますか?

これは私が試したものですが、動作しませんでした。

CREATE TABLE CONTACT_MAP 
... 
CONSTRAINT 'ContactMap_Users' 
    FOREIGN KEY ('UserID', 'UserType') 
    REFERENCES USERS ('ID') 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT 'CONTACT_MAP_CLIENTS' 
    FOREIGN KEY ('UserID', 'UserType) 
    REFERENCES CLIENTS ('ID') 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
+0

しようとしています(そしてそれは、1:NやM:N)を?あるいは、 'CONTACT_MAP'は、実際にはユーザとクライアントが持つリレーションシップから独立していますか? –

+0

彼らの関係から独立しています。ユーザーとクライアントの両方が複数の電話番号、電子メールアドレス、Facebook、Google +、ツイッターアカウントを持つことを単に説明するだけです。 –

答えて

3

FOREIGN KEY制約を書き留めるとき、子テーブルのフィールド数は、親テーブルから参照しようとしているフィールドの数と一致する必要があります。だから、あなたは...

FOREIGN KEY (UserID) REFERENCES USERS (ID) 

...か...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID, UserType) 

を書くことができます...ではなく...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID) 

あなたは本当に採用することはできませんUserTypeは正しいFOREIGN KEYを「選択」します。そのための必要性を回避する一つの方法は、継承をエミュレートし、ちょうど1 FOREIGN KEYを持つことです。このため

ER Model

エンティティ関係用語は、(:「サブタイプ関係」ERwin Methods Guide、セクションを参照してください)「カテゴリ」であります。カテゴリ記号は次のとおりです。あなたは、ユーザーとクライアントとの間の関係を表現するために使用 `CONTACT_MAP`テーブルを

Category

1

これはできません。外部キーは、単一の「外部」テーブルにのみ適用できます。

「エージェント」と「クライアント」に両方のレコードがContactMap_Usersの同じレコードを参照しているレコードがある場合、どうなるかを考えてみましょう。あなたは彼らに行動を起こさせないようにしましたが、カスケードするように設定されているようなふりをしましょう。あなたはCLIENTSに親レコードを削除する場合は、[いいえ、DBMSは、外部キーを追跡し、contactmap_usersに子レコードを削除します...そして今ACTIONS内の他の親レコードがぶら下がっている...更新用

同じ。 ACTIONSのレコードを更新します。このレコードはこのマップテーブルにカスケードされ、CLIENTSの親レコードはダングリングします。

+0

申し訳ありませんが、代理店はユーザーです(変更した場合、他のユーザーとの関連がより簡単になると思いました)。私はそれらを2つの同一のテーブルに分けることができますが、その代わりに "enum( 'user'、 'client')という列を使用して2つを区別することができます。 。 –

関連する問題