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