Я пытаюсь имитировать что-то похожее на FB. По сути, пользователи могут оставлять комментарии в различных частях профиля пользователя (например, «стена», «фотография» и т. Д.). Я думаю, что следующая модель будет работать:
===========================
wall_message
===========================
- id (PK)
- parent_id (FK)
- wall_owner_profile_id (FK, identify whose wall the message is for)
- poster_profile_id (FK)
- message
- timestamp
===========================
media_message
===========================
- id (PK)
- parent_id (FK)
- media_id (FK, identify which photo, video, etc.)
- poster_profile_id (FK)
- message
- timestamp
parent_id
позволяет "группировать" сообщения в связанные обсуждения. parent_id
первого сообщения будет 0, а последующие сообщения будут иметь PK в качестве значения parent_id
(создание отношения родитель-потомок).
poster_profile_id
определяет, кто отправил сообщение.
Приведенные выше две таблицы очень похожи. Было бы неплохо объединить их, например:
===========================
message
===========================
- id (PK)
- parent_id (FK)
- type (ENUM: "wall", "media", etc.)
- types_id (FK, see explanation below)
- poster_profile_id (FK)
- message
- timestamp
В этом случае, если, скажем, type
- это "стена", то types_id
будет равно "wall_owner_profile_id" первого стола. Если, скажем, type
является «медиа», то types_id
равно значению media_id
.
второй таблицы.
Меня немного беспокоит, что для второго подхода требуется столбец, чтобы объяснить значение другого столбца. Я полагаю, что недостатком этого является отсутствие ссылочной целостности для types_id (в отличие от «wall_owner_profile_id» и «media_id»).
Как лучше всего решить эту проблему?
РЕДАКТИРОВАТЬ 1:
Похоже, что до сих пор это решение:
===========================
message
===========================
- message_id (PK)
- parent_message_id (FK)
- profile_id (FK, referring to who posted the message)
- message
- subject (applicable only for emails)
- timestamp
===========================
wall_message
===========================
- message_id (FK)
- profile_id (FK, referring to who received the message/owner of wall)
===========================
media_message
===========================
- message_id (FK)
- media_id (FK)
===========================
email_message
===========================
- message_id (FK)
- profile_id (FK, referring to who received the message)