Как я могу создать внешний ключ для столбца, каждая запись которого может ссылаться на столбец в одной из нескольких таблиц? - PullRequest
7 голосов
/ 19 февраля 2010

Я в процессе создания социальной сети.Он имеет несколько объектов, таких как новости, фото, которые могут иметь комментарии.Поскольку все комментарии имеют одинаковые столбцы и ведут себя одинаково, и единственное различие заключается в их типе - новости, фотография или что-то еще, что будет добавлено в будущем - я решил создать одну таблицу для всех комментариев со столбцом с именем type.Это работало отлично, пока я не решил добавить внешние ключи в свою схему базы данных.

Таблица comment имеет столбец parent, который ссылается на id из news или photo таблицы, в зависимости отв столбце type.

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

Вся база данных теперь используетвнешние ключи, кроме этого столбца parent в таблице comment.Это беспокоит меня, потому что это только место, где я не могу добавить внешний ключ.

Я уверен, что не могу создать такой внешний ключ;кое-что в моей структуре базы данных должно быть изменено.Я решил создать одну таблицу для комментариев, чтобы быть готовым к добавлению новых типов комментариев для новых объектов в будущем - видео, музыки, статей и т. Д., И не впадать в адский ад, когда я хочу добавить одну новую колонку для всех комментариев..

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

Может быть, мне следует создать какую-то таблицу ссылок, которая связывает таблицу comment с таблицами других сущностей?Но, может быть, это решение еще сложнее, чем создание отдельной таблицы для каждого типа комментария?

Может быть, у меня должно быть несколько столбцов в таблице comment, например, newsId, photoId, к которым я могудобавить внешний ключ?

Эти решения просто не кажутся мне элегантными, или я просто что-то неправильно понимаю.Мое восприятие этого вопроса может быть совершенно неверным.Вот почему я здесь.Пожалуйста, поделитесь своими идеями.

1 Ответ

5 голосов
/ 19 февраля 2010

Я думаю, что ваша проблема в том, что у вас есть несколько объектов - новости, фотографии. Но это всего лишь типы (скажем) предметов. Как и комментарии, элементы, вероятно, будут иметь некоторые общие атрибуты, а также некоторые различные атрибуты. Одним из таких атрибутов будет возможность комментировать.

В этом подходе у вас есть таблица CommentableItems (1) с общими атрибутами. Затем у вас есть несколько вложенных таблиц NewsItems, PhotoItems и т. Д. Довольно просто настроить ключи для этих таблиц, чтобы обеспечить требуемое отношение один к одному. Очевидно, что у комментариев есть внешний ключ, который ссылается на CommentableItems.

(1) На самом деле, я бы, вероятно, застрелился, а не позволил бы таблице, называемой чем-то столь же ужасным, как CommentableItems, в мою схему, но это только для примера.

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