2013-12-09 4 views
1

Я разрабатываю базу данных. Это то, что я должен представлять:Как узнать, сколько непрочитанных групповых сообщений у меня есть

  • Пользователь может иметь 0..n друзей.
  • Пользователь может отправить сообщение 0..n другу.
  • Пользователь может быть членом группы 0..n.
  • Группа может иметь членов 1..n.
  • Пользователь может отправлять сообщения 0..n группе.

Чтобы управлять разговорами между пользователями, и группой у меня есть таблица (Talk) с этими столбцами:

TalkId   (NOT NULL, PK) 
Type    (NOT NULL, values: UserTalk or GroupTalk) 
StarterUserId (NOT NULL, the user that has started the talk). 
RecepientUserId: (NULL, the user that has received the first message. NULL if it is a GroupTalk). 
DateStarted:  (NOT NULL, when the talk has been started). 
GroupId:   (NULL, the group that owns the talk. NULL if it is a UserTalk) 

У меня также есть Message таблицу для хранения всех сообщений для каждого Talk. Эта таблица Message имеет столбец Read, чтобы указать, что получатель прочитал или не получил сообщение.

Если пользователь 1 посылает сообщение пользователю 2, сначала я проверить, есть ли Talk ряд с:

((StarterUserI == 1 and RecepientUserId == 2) OR 
(StarterUserI == 2 and RecepientUserId == 1)) 

Если нет, я создаю новую строку на ней. Затем я вставляю сообщение в таблицу Message с Message.TalkId, указывая на созданную мной строку.

Моя проблема заключается в том, что я не знаю, как узнать, сколько непрочитанных сообщений пользователю для группового разговора.

Для удобства говорить, если столбец Message.Read является ложным.

Чтобы узнать, есть ли у пользователя непрочитанные сообщения в разговоре группы, я могу вставить одно и то же сообщение для каждого члена группы, изменив получателя. Например:

У меня есть группа с тремя членами. Член 1 отправить сообщение группе. Я должен вставить сообщение для пользователя 2, и то же самое сообщение пользователю 3:

enter image description here

Но это может сделать расти Message стол очень быстро.

Я думал добавить новые два столбца в таблицу Talk, дату последнего сообщения, отправленного на этот разговор, и идентификатор пользователя, отправившего это последнее сообщение. Если у меня есть дата и идентификатор последнего сообщения в разговоре, я могу проверить, есть ли новые сообщения, но я не знаю, сколько.

У меня также есть таблица UserGroup для хранения пользователей, входящих в группу, и групп пользователей. Я могу добавить в эту таблицу новый столбец, чтобы хранить сколько сообщений у пользователя для группового разговора. Каждый раз, когда другой пользователь отправляет сообщение этой группе, я собираюсь вставить новую строку в таблицу Message и увеличить значение на UserGroup.Unread на один. Но я думаю, что собираюсь испортить дизайн.

Как узнать, сколько непрочитанных сообщений пользователю для группового обсуждения?

+0

Есть ли вероятность, что клиент включает TalkID при отправке сообщения? Заглядывая в таблицу 'Talk', каждый раз может не очень хорошо масштабироваться. – Twinkles

+0

И ваши столбцы 'RecepientUserId' и' GroupId' являются взаимоисключающими: один из них всегда равен NULL. Вы можете объединить их в один столбец, не содержащий NULL. – Twinkles

+0

Но RecepientUserId - это внешний ключ для таблицы пользователя, а GroupId - это внешний ключ для группы. – VansFannel

ответ

1

Вы можете добавить новую таблицу MessageStatus с колоннами UserID, MessageID и Read где вы добавляете одну строку для каждого получателя сообщения (UserTalk или GroupTalk). Это позволяет избежать избыточности, которую вы вводите при дублировании строк в таблице Message.

Для удобства вы можете ввести INSERT-trigger на Message, чтобы создать строки в MessageStatus.

+0

Мне нравится ваш ответ. – VansFannel

Смежные вопросы