2010-10-11 7 views
1

Я хочу создать систему сообщений состояния уровня 2. Каков наилучший способ создания таблиц?DB для системы комментариев

Область применения:

  1. Пользователь устанавливает Status Message
  2. пользователя Ответить на статусное сообщение

это изображение показывает его

alt text

Столы я создали

пользователей (номер, имя ....) status_messages (идентификатор, сообщение, время, user_id) status_message_replies (идентификатор, сообщение, время, status_message_id,) Пользователь D

Некоторые один предположили, что это может быть сделано в одном формате таблицы

status_messages (ID, PID, сообщение, время, user_id)

, где PID = SelfID или ParentId статуса.

Я хочу знать, какой из лучших способов создать систему?

+0

Я не могу не чувствовать, что недавно видел что-то похожее на это. , , –

+0

круто, где вы его видели? –

+3

Friendbook? Faceplace? Что-то вроде того. –

ответ

2

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

Набор исходных сообщений может быть найден где pid = selfid и ответы, где pid <> selfid. Если важно иметь возможность видеть оригинальные и ответные сообщения отдельно (без знания механизма хранения), вы можете инкапсулировать вышеуказанные условия в два вида VIEW: OriginalMessages и Responses.

Если оригиналы и ответы имеют разные атрибуты (например, если вы хотите, чтобы оригинал разрешал ссылки на URL-адреса, фотографии и т. Д.), Вы можете рассмотреть возможность использования двух отдельных таблиц. Но даже там я, вероятно, буду утверждать, что для одной таблицы есть отдельная таблица расширений для дополнительных атрибутов. Это означает, что вам не нужно хранить часто-пустые столбцы для тех исходных сообщений, которые не используют расширенные атрибуты, и впоследствии вы можете легко добавить расширенные атрибуты в ответные сообщения (при желании).

+0

до тех пор, пока «пустые» столбцы находятся в конце таблицы, почему вам все равно? –

+1

Здравый смысл утверждает, что модель чего-то не должна содержать атрибуты, которые не относятся к предмету. Одна из нормальных форм заявляет, что у вас не должно быть клеток в таблице, которые содержат NULL при нормальной обработке. И оценка эффективности означает, что вы не хотите хранить столбцы (даже NULL), которые вам не нужны. В приведенном выше примере вы можете легко вставлять таблицу расширений в представление OriginalMessages, чтобы обеспечить источник исходных сообщений с одним запросом со всеми присутствующими столбцами без дополнительного хранилища. –

+0

при установке первой записи. Я имею в виду исходное сообщение. как мне вставить pid? так как мы не будем знать идентификатор записи. нужны ли нам два запроса? вы можете привести пример sql-запроса, если не так –

2

Классическое отношение IS-A: каждый ответ - это сообщение с дополнительным атрибутом (сообщение является ответом). Возможно, это не лучший способ его моделирования. У вас будет риск написать много запросов UNION над этими двумя таблицами.

Альтернативы:

  • только одна таблица: status_messages (id, message, time, status_message_id, user_id), и позволяя status_message_id быть NULL
  • Используйте HAS-A: одна таблица status_messages (id, message, time, user_id) и один стол replies (reply_id, replies_to_id

Бывший имеет Недостаток в том, что работа с NULL сложна в SQL. Последнее потребует объединения, если вы хотите запросить ответы конкретно.

BTW это намного яснее (IMO), чтобы называть столбцы после отношения, за которое они стоят, а не таблицы, на которую они ссылаются.

+0

так что я могу использовать этот status_messages (id, pid, message, time, user_id), где pid для статуса будет идентификатором self, и если его ответ будет родительским id? –

+0

Если вы это сделаете, как вы будете идентифицировать ответ? – reinierpost

+1

Reiner: вы не используете NULL для исходных сообщений, вы устанавливаете идентификатор родительского сообщения равным идентификатору сообщения. Сообщения, которые «указывают» на себя как на родителей, являются оригиналами, сообщения с разными значениями в родительском и «я» являются ответами. Нет необходимости в NULL, и нет никаких сомнений в том, что именно. –