设计向组功能发送消息

时间:2013-11-26 11:35:34

标签: sql database database-design

我正在开发一个社交网络,用户可以在其中发送消息。

我第一次只支持用户之间的消息:用户可以向另一个消息发送消息。

在我的数据库中,我有这个表来存储消息:

Messages table

sentBysentTo是发送和接收邮件的用户的userIdtype可以是:友情请求或发送给用户的消息。

现在我必须支持 GROUPS ,任何用户都可以向群组发送消息。如果用户向组发送消息,则该组的成员将收到该消息。

我曾想过要向表Messages添加一个新类型:send to group。但是我需要将组ID添加到Message表以了解哪个是组。我可以使用sentTosentBy列,但这些列代表用户。

如何添加此功能?
我是否需要添加其他表?

2 个答案:

答案 0 :(得分:0)

我会考虑引入一个新表,该表存储1组到属于该组的n个用户的映射。

groupId int PK
userId int FK

这很简单,允许以下工作流程:

  1. 您可以轻松添加/编辑/删除特定群组中的成员。
  2. 如果要向组发送消息,可以迭代该组中的用户,并在组中的每个用户的消息中创建一条记录。
  3. 明显的缺点是Messages表可能会变得非常大。

    但好处是您可以获得有关每封邮件的详细报告/信息。

    如果你想历史地知道哪些组被邮寄到了,你可以在Messages中引入groupId字段(这对我来说感觉不对,因为它会有相当数量的NULL) - 或者你可以创建一个单独的日志表记录通过组发送电子邮件的人。

答案 1 :(得分:0)

我认为你需要五张桌子:

  • 用户
  • 成员
  • 地址
  • 消息

用户和消息已经拥有自己的表。到目前为止,非常好。

您询问了如何为组建模,以及如何在组或用户之间建模消息。

组应该有自己的表,以便您可以存储组的属性。该表至少应包含groupId列。

用户如何与群组相关联?用户可以在多个组中吗?没有团体?究竟是一组?

如果用户最多只能有一个组,则可以在Users表中添加一个额外的groupId列来存储组成员资格。

如果用户可以在多个组中,则您需要一个额外的Membership表,其中包含userId列和groupId列。

如果用户可以在0或1组中,那么您可以使groupId列可以为空,或者使用Groups表中的虚拟“not-in-a-group”行。虚拟行会使一些分析查询更容易编写。

如果用户可以在0到多个组中,那么您可以简单地通过该用户的Membership表中缺少行来模拟'not-in-a-group。

消息

消息从一个地址发送到另一个。您可以使用地址表对此进行建模。

地址表应至少包含一个addressId列。

更改Messages表的sentBy和sentTo列以引用Addresses表。

听起来每个用户或组应该只有一个地址。将addressId列添加到“用户和组”表。该列应引用Addresses表的addressId列。