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!
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. –
@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. –
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