我正在开发一个社交网络,用户可以在其中发送消息。
我第一次只支持用户之间的消息:用户可以向另一个消息发送消息。
在我的数据库中,我有这个表来存储消息:
sentBy
和sentTo
是发送和接收邮件的用户的userId
。
type
可以是:友情请求或发送给用户的消息。
现在我必须支持 GROUPS ,任何用户都可以向群组发送消息。如果用户向组发送消息,则该组的成员将收到该消息。
我曾想过要向表Messages
添加一个新类型:send to group。但是我需要将组ID添加到Message
表以了解哪个是组。我可以使用sentTo
或sentBy
列,但这些列代表用户。
如何添加此功能?
我是否需要添加其他表?
答案 0 :(得分:0)
我会考虑引入一个新表,该表存储1组到属于该组的n个用户的映射。
groupId int PK
userId int FK
这很简单,允许以下工作流程:
明显的缺点是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列。