如何知道我有多少未读的群组消息

时间:2013-12-09 08:03:41

标签: sql database database-design

我正在设计一个数据库。这就是我必须代表的:

  • 用户可以拥有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表中添加新的两列,发送到该通话的最后一条消息的日期,以及发送最后一条消息的用户的ID。如果我在谈话中有最后一条消息的日期和ID,我可以检查是否有新消息,但我不知道有多少消息。

我还有一个UserGroup表来存储作为组成员的用户以及用户组。我可以在此表中添加一个新列,以存储用户对群组通话的消息数量。每当另一个用户向该组发送消息时,我将在Message表上插入一个新行,并将UserGroup.Unread上的值增加一。但我想我会弄乱设计。

我如何知道用户对群组通话有多少未读消息?

1 个答案:

答案 0 :(得分:1)

您可以使用列MessageStatusUserIDMessageID添加新表Read,为每个邮件收件人添加一行(UserTalk或GroupTalk) 。这样可以避免在复制Message表中的行时出现的冗余。

为方便起见,您可以在Message上引入INSERT触发器以在MessageStatus中创建行。