【问题标题】:Is there a scalability issue in having a one-to-many relationship between participants and conversation?在参与者和对话之间建立一对多关系是否存在可扩展性问题?
【发布时间】:2019-12-01 00:05:17
【问题描述】:

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

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

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

问题:需要很多连接

问题是我们每次想要获得ParticipantsidConversation 来广播Messages 时都需要加入。

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

问题

  • 对此是否有更可扩展的解决方案?
  • 是否存在任何瓶颈问题?
  • 除了作为额外奖励之外,桌子还有其他问题吗?

【问题讨论】:

  • 实际上关系是多对多,你同意吗?
  • 那么你会实现一个包含参与者ID和对话ID的表作为两个表之间的外键吗?

标签: relational-database entity-relationship scalability erd


【解决方案1】:

可扩展,因为:

如果一个对话吸引了越来越多的用户(作为参与者),您只需在表Participants 中添加行。想象一下对话有一个成员列表,名为Participants

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

这两种情况都只是修改了Participants,而对话保持不变。

关联实体

UserConversation 的这种成员资格或关系通过所谓的关联关系关联表或@桥接 987654321@。表示一个User 可以参加(参与)0 个或多个Conversations,反之亦然一个Conversation 可以(至少)一个(创建者)或多个参与Users

所以Participants 的实体/表就像一个桥梁:连接两个侧面/视角。

广播示例

用户A 想要向频道/对话1 广播一条消息。现在系统需要确定所有收件人。因此,仅在表参与者中查找对话1,并找到他们的参与用户ABC。除了发件人A 之外的所有人都应该收到广播:BC

没有加入简单查询SELECT user_id FROM participants WHERE conversation_id = 1 AND user_id <> 'A'。给定Message 并假设user_ids 可以直接用作目的地(电子邮件地址、电话号码等),系统可以立即将广播发送出去。

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多