我有一个数据库设计,如下面的实体关系图(ERD(所示:
https://app.dbdesigner.net/designer/schema/0-social_media-00a3405c-0bcd-4809-9f8e-e86c1b8e5f33
我想知道我是否应该在Participants
和Conversation
之间建立一对多的关系。
问题:需要多个联接
问题是,每次我们想要获得Conversation
Participants
的id
来广播Messages
时,我们都需要加入。
不仅如此,我们还需要Messages
的content
,这意味着我们需要在三个表之间进行两个连接。
问题
- 有没有更具可扩展性的解决方案?
- 是否存在任何瓶颈问题?
- 除了作为额外的奖励之外,桌子还有什么问题吗?
因为:
如果一个对话吸引了越来越多的用户(以参与者的身份(,您只需在表格中添加行Participants
。想象一下,对话有一个成员列表,它被称为Participants
。
如果删除了一个用户帐户,您只需在表Participants
中搜索他的所有记录(关联的对话(并删除它们。
这两种情况都意味着对Participants
的修改,而对话保持不变。
关联实体
User
与Conversation
的这种成员资格或关系通过所谓的关联关系、关联表或关联实体来桥接。意味着一个User
可以参加(参与(0个或多个Conversations
,反之亦然,一个Conversation
可以(至少(有一个(创建者(或许多参与Users
。
因此,实体/表Participants
就像一座桥梁:连接两侧/视角。
广播示例
用户A
想要向频道/对话1
广播消息。现在,系统需要确定所有收件人。因此,仅在表参与者中查找对话1
,并找到他们的参与者用户A
,B
和C
。除发送方A
外,所有都应接收广播:B
和C
。
没有涉及任何加入。一个简单的查询:SELECT user_id FROM participants WHERE conversation_id = 1 AND user_id <> 'A'
。给定Message
并假设user_id
可以直接用作目的地(电子邮件地址、电话号码等(,系统可以立即发送广播。