使用 mongodb 的聊天应用程序架构
Schema for chat application using mongodb
我正在尝试为 mongodb
中的聊天应用程序构建架构。我有两种类型的用户模型 - Producer
和 Consumer
。生产者和消费者可以相互对话。我的最终目标是获取任何生产者和消费者的所有对话并将它们显示在列表中,就像所有消息传递应用程序(例如 Facebook)所做的那样。
这是我想出的schema
:
Producer: {
_id: 123,
'name': "Sam"
}
Consumer:{
_id: 456,
name: "Mark"
}
Conversation: {
_id: 321,
producerId: 123,
consumerId: 456,
lastMessageId: 1111,
lastMessageDate: 7/7/2018
}
Message: {
_id: 1111,
conversationId: 321,
body: 'Hi'
}
现在我想获取 Sam 的所有会话。我想像 Facebook 一样在列表中显示它们,将它们分组
每个消费者并根据时间排序。
我想我需要为此做以下查询:
1) 获取所有 producerId 为 123
按 lastMessageDate 排序的对话。
然后我可以显示所有对话的列表。
2) 如果我想知道对话中的所有消息,我查询 Message 并获取 conversationId 为 321
的所有消息
现在,对于每个新的 message
,我还需要每次用新的 messageId 和日期更新 conversation
。这是继续进行的正确方法吗?考虑到所涉及的查询数量,这是最佳方法吗?有没有更好的方法我可以继续这个?任何帮助将不胜感激。
设计:
我不会说这很糟糕。根据您描述的情况,它实际上非常好。最后一条消息日期和 ID 的这种非规范化非常好,特别是如果您计划一个包含所有对话列表的视图 - 您在同一查询中有最后一条消息日期。如果在此视图中适用,甚至可以更进一步并添加最后一条消息文本。
您可以在 MongoDB 博客(第 1, 2 and 3 部分)上阅读更多关于非规范化(和一般模式建模)的优缺点的信息。不是那么新鲜,但也不过时。
此外,如果此类多文档更新可能会因某些可能的不一致而让您感到害怕,MongoDB v4 会为您提供 transactions。
正在查询:
一方面,您可以涉及多个查询,这一点也不坏(尤其是当很少有查询很容易缓存时,例如生产者或消费者数据)。另一方面,如果需要,您可以使用 aggregations 一次获取所有这些东西。
我正在尝试为 mongodb
中的聊天应用程序构建架构。我有两种类型的用户模型 - Producer
和 Consumer
。生产者和消费者可以相互对话。我的最终目标是获取任何生产者和消费者的所有对话并将它们显示在列表中,就像所有消息传递应用程序(例如 Facebook)所做的那样。
这是我想出的schema
:
Producer: {
_id: 123,
'name': "Sam"
}
Consumer:{
_id: 456,
name: "Mark"
}
Conversation: {
_id: 321,
producerId: 123,
consumerId: 456,
lastMessageId: 1111,
lastMessageDate: 7/7/2018
}
Message: {
_id: 1111,
conversationId: 321,
body: 'Hi'
}
现在我想获取 Sam 的所有会话。我想像 Facebook 一样在列表中显示它们,将它们分组 每个消费者并根据时间排序。 我想我需要为此做以下查询:
1) 获取所有 producerId 为 123
按 lastMessageDate 排序的对话。
然后我可以显示所有对话的列表。
2) 如果我想知道对话中的所有消息,我查询 Message 并获取 conversationId 为 321
现在,对于每个新的 message
,我还需要每次用新的 messageId 和日期更新 conversation
。这是继续进行的正确方法吗?考虑到所涉及的查询数量,这是最佳方法吗?有没有更好的方法我可以继续这个?任何帮助将不胜感激。
设计: 我不会说这很糟糕。根据您描述的情况,它实际上非常好。最后一条消息日期和 ID 的这种非规范化非常好,特别是如果您计划一个包含所有对话列表的视图 - 您在同一查询中有最后一条消息日期。如果在此视图中适用,甚至可以更进一步并添加最后一条消息文本。
您可以在 MongoDB 博客(第 1, 2 and 3 部分)上阅读更多关于非规范化(和一般模式建模)的优缺点的信息。不是那么新鲜,但也不过时。
此外,如果此类多文档更新可能会因某些可能的不一致而让您感到害怕,MongoDB v4 会为您提供 transactions。
正在查询: 一方面,您可以涉及多个查询,这一点也不坏(尤其是当很少有查询很容易缓存时,例如生产者或消费者数据)。另一方面,如果需要,您可以使用 aggregations 一次获取所有这些东西。