2012-01-25 20 views
0

データベース設計では、2エンティティが2つのリレーションシップを持つことができますか?すなわち、例えば、2つのエンティティドナーと管理者が存在する.2つの関係がある。 1.管理者はドナーの詳細にアクセスする。 2.管理者はドナーにコンタクトすることができ、逆も可能である。 2人の関係で参加できるか?2エンティティは2つのリレーションシップを持つことができます

答えて

1

データベース内の「アクセス」と「連絡先」リレーションをモデル化することは、アプリケーションによって異なります。私はあなたの例にとどまり、これらの関係がnからnであると仮定します。ここではSQLが(警告、構文テストされていない)ように見えることができるかです:

CREATE TABLE admin (
    id int unsigned AUTO_INCREMENT PRIMARY KEY, 
    name text NOT NULL 
); 

CREATE TABLE donor (
    id int unsigned AUTO_INCREMENT PRIMARY KEY, 
    name text NOT NULL 
); 

CREATE TABLE admin_donor_access_details (
    id_admin int unsigned NOT NULL, 
    id_donor int unsigned NOT NULL, 
    PRIMARY KEY (id_admin, id_donor), 
    CONSTRAINT FOREIGN KEY(id_admin) REFERENCES admin(id) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(id_donor) REFERENCES donor(id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE admin_donor_contact (
    id_admin int unsigned NOT NULL, 
    id_donor int unsigned NOT NULL, 
    PRIMARY KEY (id_admin, id_donor), 
    CONSTRAINT FOREIGN KEY(id_admin) REFERENCES admin(id) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(id_donor) REFERENCES donor(id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

2人の関係もこのように、ブールフラグと単一結合テーブルで表現することができます

CREATE TABLE admin_donor (
    id_admin int unsigned NOT NULL, 
    id_donor int unsigned NOT NULL, 
    detail_access tinyint(1) NOT NULL, 
    contact tinyint(1) NOT NULL, 
    PRIMARY KEY (id_admin, id_donor), 
    CONSTRAINT FOREIGN KEY(id_admin) REFERENCES admin(id) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(id_donor) REFERENCES donor(id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

これは、リレーションシップを追加するときに行を挿入または更新するかどうか、リレーションシップを削除するときに行を削除または更新するかどうかを判断する必要があるため、コードに余計な労力をかけることになります。

関連する問題