gpt4 book ai didi

database - 使用 mongodb 的聊天应用程序架构

转载 作者:可可西里 更新时间:2023-11-01 09:33:25 28 4
gpt4 key购买 nike

我正在尝试在 mongodb 中为聊天应用程序构建一个模式。我有两种类型的用户模型 - ProducerConsumer。生产者和消费者可以相互对话。我的最终目标是获取任何生产者和消费者的所有对话并将它们显示在列表中,就像所有消息传递应用程序(例如 Facebook)所做的那样。

这是我想出的模式:

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 的所有 Conversations,按 lastMessageDate 排序。 然后我可以显示所有对话的列表。

2) 如果我想知道对话中的所有消息,我在 Message 上查询并获取 conversationId 为 321

的所有消息

现在,对于每条新的 message,我还需要每次都使用新的 messageId 和日期更新 conversation。这是继续进行的正确方法吗?考虑到所涉及的查询数量,这是最佳方法吗?有没有更好的方法我可以继续这个?任何帮助将不胜感激。

最佳答案

设计:我不会说这很糟糕。根据您描述的情况,它实际上非常好。最后一条消息日期和 ID 的这种非规范化非常好,特别是如果您计划一个包含所有对话列表的 View - 您在同一查询中有最后一条消息日期。如果在此 View 中适用,甚至可以更进一步并添加最后一条消息文本。

您可以在 MongoDB 博客(第 123 部分)上阅读更多关于非规范化(和一般模式建模)的优缺点的信息。它不是那么新鲜,但也不过时。

此外,如果此类多文档更新可能会因某些可能的不一致而让您感到害怕,MongoDB v4 会为您提供 transactions .

查询:一方面,您可以涉及多个查询,这一点也不坏(尤其是当很少有查询很容易缓存时,例如生产者或消费者数据)。另一方面,您可以使用 aggregations如果需要,一次获取所有这些东西。

关于database - 使用 mongodb 的聊天应用程序架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51217206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com