我具有数据库设计,如以下实体关系图(ERD)所示:
https://app.dbdesigner.net/designer/schema/0-social_media-00a3405c-0bcd-4809-9f8e-e86c1b8e5f33
我想知道我是否应该在Participants
和Conversation
之间建立一对多关系。
问题是,每次要获取id
的Participants
的Conversation
来广播Messages
时,我们都需要进行联接。
不仅如此,我们还需要content
的Messages
,这意味着我们需要在三个表之间进行两个联接。
[如果一个对话吸引了越来越多的用户(以其参与者的身份),则只需在表Participants
中添加行。假设对话中有一个成员列表,它称为Participants
。
如果删除了一个用户帐户,您只需要在表Participants
中搜索其所有记录(相关的对话)并删除它们。
这两种情况都只表示对Participants
的修改,而对话保持不变。
User
与Conversation
的这种隶属关系或关系通过所谓的[[关联关系,关联表或associative entity被桥接。表示一个User
可以参加(或参加)0个或多个Conversations
,反之亦然一个Conversation
可以拥有(至少)一个(创建者)或多个Users
。
Participants
的作用类似于桥:连接两个侧面/视角。
广播示例A
想要向频道/会话1
广播消息。现在,系统需要确定所有收件人。因此,在会话1
中查找仅在表参与者中
,并找到其参加的用户A
,B
和C
。除发件人A
外,所有其他人都应接收广播:B
和C
。涉及no join
。 简单查询:SELECT user_id FROM participants WHERE conversation_id = 1 AND user_id <> 'A'
。给定Message
并假定user_id
可以直接用作目的地(电子邮件地址,电话号码等),系统可以立即将广播发送出去。