Я разрабатываю базу данных. Это то, что я должен представлять:Как узнать, сколько непрочитанных групповых сообщений у меня есть
- Пользователь может иметь 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:
Но это может сделать расти Message
стол очень быстро.
Я думал добавить новые два столбца в таблицу Talk
, дату последнего сообщения, отправленного на этот разговор, и идентификатор пользователя, отправившего это последнее сообщение. Если у меня есть дата и идентификатор последнего сообщения в разговоре, я могу проверить, есть ли новые сообщения, но я не знаю, сколько.
У меня также есть таблица UserGroup
для хранения пользователей, входящих в группу, и групп пользователей. Я могу добавить в эту таблицу новый столбец, чтобы хранить сколько сообщений у пользователя для группового разговора. Каждый раз, когда другой пользователь отправляет сообщение этой группе, я собираюсь вставить новую строку в таблицу Message
и увеличить значение на UserGroup.Unread
на один. Но я думаю, что собираюсь испортить дизайн.
Как узнать, сколько непрочитанных сообщений пользователю для группового обсуждения?
Есть ли вероятность, что клиент включает TalkID при отправке сообщения? Заглядывая в таблицу 'Talk', каждый раз может не очень хорошо масштабироваться. – Twinkles
И ваши столбцы 'RecepientUserId' и' GroupId' являются взаимоисключающими: один из них всегда равен NULL. Вы можете объединить их в один столбец, не содержащий NULL. – Twinkles
Но RecepientUserId - это внешний ключ для таблицы пользователя, а GroupId - это внешний ключ для группы. – VansFannel