2009-04-17 19 views
2

私はmysqlのbdスキームを設計しています。私のdbはa、b、cの3種類の点を格納し、経路はn点の組で構成されます:同じ列の外部キーの参照

Route = [(a1またはb1またはc1; a2またはb2またはc2)、(a2またはb2またはC2、A3またはB3またはC3)、...]

create table a_points (
    point_id serial  not null, 
    owner_id bigint unsigned not null, 
    name  varchar(20) not null, 

    primary key (point_id), 
    foreign key (owner_id) references othertable (other_id) 
    ) engine = InnoDB; 


create table b_points (
    point_id serial  not null, 
    owner_id bigint unsigned not null, 
    name  varchar(20) not null, 
    fields  varchar(20) not null, 


    primary key (point_id), 
    foreign key (owner_id) references othertable (owner_id) 

    ) engine = InnoDB; 

create table c_points (
    point_id serial  not null, 
    name  varchar(20) not null, 
    cfields  varchar(20) not null, 

    primary key (point_id) 
    ) engine = InnoDB; 

create table paths (
    path_id serial   not null, 
    name  varchar(20) not null, 

    primary key (path_id) 
    ) engine = InnoDB; 

create table point_pairs (
    pair_id  serial  not null, 
    path_id bigint unsigned not null, 
    point_from bigint unsigned not null, 
    point_to bigint unsigned not null, 
    table_from varchar(9) not null, 
    table_to varchar(9) not null, 

    primary key (pair_id), 
    foreign key (path_id) references paths (path_id) 
    ) engine = InnoDB; 

(*)点の対は(M、N)またはMからN

にだからポイントのペアを格納していていますパスのIDとともに私の問題は、mとnのテーブルの名前を識別する2つの列を作成しなければならなかったことです。 mはtable_from、nはtable_toです。したがって、ルート(pathとpoint_pairsテーブル)にどのようなポイントが保存されているかを知るには、これらの2つのカラムをコードで使用する必要があります。私の質問:MySqlは同じ列のn個の外部キーを参照するための何かを提供しますか?私はすでにa、b、cのポイントテーブルに参加することを考えましたが、この新しいテーブルにタイプカラムを追加しなければならなくなり、PHPクラスが役に立たなくなります。

ありがとうございます!

答えて

3

あなたはPolymorphic Associationsというパターンを使用していますが、それを行う方法はなく、外部キーを使用して参照整合性を強制する方法はありません。

a_pointsb_points、およびc_pointsという共通の表を作成することをお勧めします。次に、あなたのポイントペアは、その共通テーブルを参照することができます。

言い換えると、多態性協会を動作させる方法は、参照の方向を逆にすることです。

+0

これは、私が他の議論で「汎化特化パターン」と呼んできたことの素敵な要約です。私は多態性協会について学ばなければならないでしょう。 –

+0

@Walter Mitty:先日あなたが言いました。私はあなたのためにそのフレーズを使用する唯一の人だと思います。 Polymorphic Associationsは、Hibernate、Ruby on Railsなどで使用される用語です。 –

+0

GUIDを 'a_points'、' b_points'、 'c_points'に' PRIMARY KEY'として使用し、同じGUIDを'common_points'の' PRIMARY KEY'ですか?そのようにして、私はすべての多形性結合の仲介者として働くことができる1つのテーブル 'メタ'を持つことができます。 – paulkon

関連する問題