Я сталкиваюсь с ситуацией, когда мне нужно ссылаться на разные типы данных.
Проще говоря, это система уведомлений, где пользователи могут получать уведомления о новых комментариях на веб-странице, за которой они следуют, или об ответах на комментарии, за которыми они следуют.
У меня есть следующий (уменьшенный) макет
Таблица: комментарии
comment_id (int) PRIMARY # primary key
entry_id (int) NULL # id of the webpage (entry), null if reply to existing comment
comment_parentid NULL # parent id of comment if reply, null if root comment
Таблица: последователи
user_id (int) # the user following
entry_id (int) NULL # webpage the user follows, null if it this entry is only for following replys to a specific comment
comment_parentid NULL # comment the user follows replys to, null if the user if this following entry represents following of the complete post on the webpage (notification for all new comments)
Как вы видите, это имеет смысл, только если заполнено ровно ОДНО из рассматриваемых полей (entry_id, comment_parentid).
У меня также возникают проблемы с поиском первичного ключа для следующей таблицы. Поскольку первичные ключи не могут содержать пустые поля.
Поэтому я подумал, что я сделал только одно поле с именем "parent_id" или "follow_item_id" и установил дополнительный флаг перечисления, какой это родительский идентификатор.
Таким образом, следующая таблица будет выглядеть так:
user_id (int) PRIMARY
followed_item_id (int) PRIMARY
followed_item_type ENUM('entry','comment') PRIMARY
Применяя ту же технику моделирования, таблица комментариев будет выглядеть так:
comment_id (int) PRIMARY # primary key
comnent_parentid_type ENUM('entry','comment') # parent id type. entry or comment.
comment_parentid (int) # parent id representing comment or entry
Но я помню, что у меня когда-то была Проблема, когда я хотел сделать что-то подобное, но были очень хорошие аргументы против этого. Я просто не могу вспомнить и не могу найти пост.
Так что же является хорошим способом структурировать такие данные?
Маби две таблицы, которые я выбираю с помощью оператора UNION?