MySQL - установка внешних ключей со сложным шаблоном (отображение нескольких таблиц на одну карту) - PullRequest
0 голосов
/ 04 декабря 2011

Я настраиваю базу данных приложения, и мне трудно настроить внешние ключи. Базовый дизайн включает три таблицы: пользователи, клиенты и contact_map. У пользователей есть клиенты. Как пользователи, так и клиенты имеют несколько учетных записей телефона и электронной почты. Карта контактов содержит те. У этого есть UserID, UserType, Key, Value.

UserID = идентификатор из таблицы клиента или пользователя. UserType = enum ('user', 'client') Ключ / значение = пара ключ / значение телефона или адреса электронной почты.

Возможно ли то, что я пытаюсь сделать, и если да, то как ты это делаешь?

Это то, что я пытался, но это не сработало.

CREATE TABLE CONTACT_MAP
...
CONSTRAINT 'ContactMap_Users'
    FOREIGN KEY ('UserID', 'UserType' )
    REFERENCES USERS ('ID')
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT 'CONTACT_MAP_CLIENTS'
    FOREIGN KEY ('UserID', 'UserType )
    REFERENCES CLIENTS ('ID')
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

При записи ограничения FOREIGN KEY количество полей в дочерней таблице должно соответствовать количеству полей, на которые вы пытаетесь ссылаться из родительской таблицы.Таким образом, вы можете написать ...

FOREIGN KEY (UserID) REFERENCES USERS (ID)

... или ...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID, UserType)

... но не ...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID)

Вы не можете использовать UserType, чтобы «выбрать» правильный КЛЮЧ.Один из способов обойти необходимость в этом состоит в том, чтобы эмулировать наследование и иметь только один ИНОСТРАННЫЙ КЛЮЧ:

ER Model

Термин «отношение сущности» для этого термина «категория» (см. Руководство по методам ERwin , раздел «Отношения подтипов»).Символ категории:

Category

1 голос
/ 04 декабря 2011

Это невозможно.Внешний ключ может применяться только к одной «внешней» таблице.

Подумайте, что произойдет, если у вас есть запись в 'AGENTS' и в 'CLIENTS', которые оба ссылаются на одну и ту же запись в ContactMap_Users.Вы настроили их на бездействие, но давайте представим, что они настроены на каскад.Нет, если вы удалите родительскую запись в CLIENTS, СУБД будет следовать внешним ключам и удалит дочернюю запись в contactmap_users ... и теперь другая родительская запись в ACTIONS свисает ...

То же самое для обновления.Вы обновляете запись в ACTIONS, которая идет вниз к этой таблице карт, и теперь родительская запись в КЛИЕНТАХ свисает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...