2009-04-17 10 views
2

Je suis en train de concevoir un bd-scheme pour mysql. Mon db stocke 3 types de points: a, b ou c et un chemin est composé de n paires de points:Référencement de clés étrangères dans la même colonne

Route = [(a1 ou b1 ou c1; a2 ou b2 ou c2), (a2 ou b2 ou c2; a3 ou b3 ou 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; 

(*) une paire de points est (m, n) ou de m à n

Je suis stocker paire de points avec l'ID de leur chemin. Mon problème est que j'ai dû créer deux colonnes identifiant le nom des tables de m et n. table_from pour m et table_to pour n. Ainsi, je devrais utiliser ces deux colonnes dans mon code pour savoir quel type de points sont sauvegardés dans une route (table path et point_pairs). Ma question: MySql fournit-il quelque chose pour référencer n clés étrangères dans la même colonne? Je pensais déjà à rejoindre les tables de points a, b et c mais je devrais ajouter une colonne de type à cette nouvelle table et mes classes php deviendraient inutiles.

Merci d'avance!

Répondre

3

Vous utilisez un modèle appelé Associations polymorphes, et non, il n'y a aucun moyen de le faire et d'utiliser des clés étrangères pour appliquer l'intégrité référentielle.

Je vous suggère de faire une table commune qui référence a_points, b_points, et c_points. Ensuite, vos paires de points peuvent référencer cette table commune. En d'autres termes, la façon de faire fonctionner les Associations Polymorphes est d'inverser la direction de la référence.

+0

Ceci est un bon résumé de ce que j'ai appelé «modèle de spécialisation de généralisation» dans d'autres discussions. Je vais devoir apprendre à propos des associations polymorphes. –

+0

@Walter Mitty: Je vous ai vu le mentionner l'autre jour. Je pense que vous êtes le seul à utiliser cette expression pour cela. Les associations polymorphes sont le terme utilisé dans Hibernate, Ruby on Rails, etc. –

+0

Est-ce aussi une bonne idée d'utiliser les GUID comme 'PRIMARY KEY's pour' a_points', 'b_points',' c_points' et d'utiliser le même GUID comme 'PRIMARY KEY' dans' common_points'? De cette façon, je peux avoir une table 'meta' qui peut servir d'intermédiaire pour toutes les associations polymorphes. – paulkon