2012-05-24 3 views
1

Там находятся две таблицы - сообщения и комментарии:Многие таблицы, ссылающихся на один стол поле

create table posts 
(
    id integer not null primary key auto_increment, 
    body text not null 
); 

create table comments 
(
    id integer not null primary key auto_increment, 
    body text not null, 
    post_id integer not null references posts(id) 
); 

Теперь я хочу создать еще одну таблицу - отчеты («плохой пост» флаги), и я хочу, чтобы хранить отчеты для обеих должностей и комментариев.

create table reports 
(
    id integer not null primary key auto_increment, 
    obj_type tinyint not null, /* '1' for posts and '2' for comments */ 
    obj_id integer not null, 
    body text not null 
); 

alter table reports add foreign key(obj_id) references posts(id) on delete cascade; 
alter table reports add foreign key(obj_id) references comments(id) on delete cascade; 

Как вы видите, есть две ссылки в одном поле (я дифференцируются их OBJ_ID), и вопрос - Является ли все это правильно делать, как это?

Если нет, то что было бы лучшим решением?

Заранее благодарен.

ответ

1

Интуитивно, что это не правильный способ сделать это. Я думаю, что MySQL тоже будет смущен; как бы он подтвердил, что ограничение выполняется; попробовал бы сначала posts, или comments первый ... может быть, оба?

Лично я выбрал бы создать две таблицы ссылок:

  • comments <-> reports
  • posts <-> reports

Таким образом, вы неоднозначность obj_id правильно.

+0

На самом деле я использую фреймворк Yii php, и я могу обработать «на удалении каскада» оттуда. Мне нужны внешние ключи, чтобы использовать отношения уровня ORM. И важно то, что сообщения и комментарии - всего лишь пример, в действительности мне нужны флаги для 4 таблиц. Мне нужен гибкий способ без дополнительных 4 таблиц. – Acute

+0

@ Акуйте, если честно, я понятия не имею, как MySQL хранит эти два внешних ключа =/возможно, это специальная функция? –

+0

Я не знаю, но мне не нравится создавать несколько FK, не похоже на элегантное решение) Хорошо, если я решаю делать таблицы ссылок, я выберу ваш ответ как решение – Acute

0

Вам просто нужно ссылаться на таблицу комментариев, поскольку она уже ссылается на таблицу сообщений, таким образом, всякий раз, когда вы получаете отчет, у вас есть ключ к комментарию и ключ к сообщению.

Смежные вопросы