Моделирование базы данных: сообщения типа Facebook

Я пытаюсь имитировать что-то похожее на 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)
7
задан StackOverflowNewbie 27 November 2010 в 13:14
поделиться