Я пытаюсь имитировать что-то похожее на 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
позволяет «группировать» сообщения в связанное обсуждение. Первое сообщение ' s 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
- это "media", то 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)