2013-12-09 28 views
1

我正在设计一个数据库。这是我必须表示的:如何知道我有多少个未读群消息

  • 用户可以有0..n个朋友。
  • 用户可以向朋友发送0..n条消息。
  • 用户可以是0..n组的成员。
  • 一个组可以有1..n个成员。
  • 用户可以向组发送0..n条消息。

为了管理用户之间的对话,以及组I具有与这些列的表格(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。但我想我会搞乱设计。

我如何知道用户有多少条未读邮件用于Group Talk?

+0

发送消息时,客户端是否有可能包含TalkID?每次查看“谈话”表格可能不会很好地扩展。 – Twinkles

+0

而你的列'RecepientUserId'和'GroupId'是互斥的:它们之一总是NULL。你可以将它们组合成一个不可空的列。 – Twinkles

+0

但RecepientUserId是用户表的外键,GroupId是组表的外键。 – VansFannel

回答

1

您可以添加一个新表MessageStatus与在其中添加一行一条消息(UserTalk或GroupTalk)的每个收件人列UserIDMessageIDRead。这样可以避免在复制Message表中的行时引入冗余。

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

+0

我喜欢你的答案。 – VansFannel

相关问题