参与者和对话之间是否存在一对多关系?

问题描述 投票:-1回答:1

我具有数据库设计,如以下实体关系图(ERD)所示:

https://app.dbdesigner.net/designer/schema/0-social_media-00a3405c-0bcd-4809-9f8e-e86c1b8e5f33

我想知道我是否应该在ParticipantsConversation之间建立一对多关系。

问题:需要很多联接

问题是,每次要获取idParticipantsConversation来广播Messages时,我们都需要进行联接。

不仅如此,我们还需要contentMessages,这意味着我们需要在三个表之间进行两个联接。

问题

  • 是否有更可扩展的解决方案?
  • 是否存在瓶颈问题?
  • 除了作为额外的奖励之外,桌子还有其他问题吗?
relational-database entity-relationship scalability erd
1个回答
0
投票

可伸缩,因为:

[如果一个对话吸引了越来越多的用户(以其参与者的身份),则只需在表Participants中添加行。假设对话中有一个成员列表,它称为Participants

如果删除了一个用户帐户,您只需要在表Participants中搜索其所有记录(相关的对话)并删除它们。

这两种情况都只表示对Participants的修改,而对话保持不变。

关联实体

UserConversation的这种隶属关系或关系通过所谓的[[关联关系,关联表或associative entity桥接。表示一个User可以参加(或参加)0个或多个Conversations,反之亦然一个Conversation可以拥有(至少)一个(创建者)或多个Users

因此,实体/表Participants的作用类似于

桥:连接两个侧面/视角。

广播示例

用户A想要向频道/会话1广播消息。现在,系统需要确定所有收件人。因此,在会话1中查找

仅在表参与者中

,并找到其参加的用户ABC。除发件人A外,所有其他人都应接收广播:BC涉及

no join

简单查询SELECT user_id FROM participants WHERE conversation_id = 1 AND user_id <> 'A'。给定Message并假定user_id可以直接用作目的地(电子邮件地址,电话号码等),系统可以立即将广播发送出去。
© www.soinside.com 2019 - 2024. All rights reserved.