Ссылка на внешние ключи в том же столбце - PullRequest
2 голосов
/ 17 апреля 2009

Я разрабатываю bd-схему для mysql. Моя база данных хранит 3 вида точек: a, b или c, а путь состоит из n пар точек:

Маршрут = [(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

Итак, я храню пару точек вместе с идентификатором их пути. Моя проблема заключается в том, что мне пришлось создать два столбца, идентифицирующих имена таблиц m и n. table_from для m и table_to для n. Таким образом, мне пришлось бы использовать эти два столбца в моем коде, чтобы узнать, какие типы точек сохраняются на маршруте (таблица path и point_pairs). Мой вопрос: предоставляет ли MySql что-то для ссылки на n внешних ключей в том же столбце? Я уже думал о присоединении таблиц точек a, b и c, но мне пришлось бы добавить столбец типа в эту новую таблицу, и мои классы php стали бы бесполезными.

Заранее спасибо!

1 Ответ

3 голосов
/ 17 апреля 2009

Вы используете шаблон под названием «Полиморфные ассоциации», и нет, нет способа сделать это и использовать внешние ключи для обеспечения ссылочной целостности.

Я предлагаю вам составить одну общую таблицу, на которую ссылаются a_points, b_points и c_points. Тогда ваши пары точек могут ссылаться на эту общую таблицу.

a_points -->
b_points -->  common_points  <-- point_pairs
c_points -->

Другими словами, способ заставить полиморфные ассоциации работать, это изменить направление ссылки.

...