在群聊应用程序中查询所有消息的最有效方法是什么?

问题描述

我将用一个例子来说明我的问题。

您有一个群组聊天表,用于存储有关群组聊天的数据。

-------------------+
id | name |owner_id|
-------------------+
33 | code | 45

您有一个包含消息的消息表

-------------------------------------+
id | content | user_id | chat_room_id
-------------------------------------+
5  | "hello" | 41      | 33
2  | "hi"    | 43      | 33

您有一个用户表,其中包含用户信息以及他们属于的群聊:

-------------------------------------+
id | name | chat_room_id
-------------------------------------+
5  |"nick"| 33
2  |"mike"| 33
  1. 这是建立数据库的正确方法吗?
  2. 没有关节或外键。加载所有消息和用户数据并使其具有某种格式的最有效方法是什么,该格式使您可以构造一个UI,在其中将用户数据显示在消息旁边?

我的解决方案:

如果您查询邮件数据库并检索所有聊天室ID等于33的邮件,您将得到一个看起来像

的数组
[
  {
   id : 5,user_id : 41,content : "hello"
  },{       
   id : 2,user_id : 43,content : "hi"
  }
]

您可以看到用户ID是消息对象的一部分。

解决方案1 ​​ :(天真): 遍历messages数组并使用用户ID查询数据库。 这是一个糟糕的解决方案,因为从循环中查询数据库绝不是一个好主意。

解决方案2 :(有效,但响应中发送的数据更少): 遍历消息数组并构造用户ID数组,并在查询中使用它 使用WHERE user_id IN 然后遍历用户数组,并使用用户ID作为键来构造哈希表,因为它是唯一的。 在前端,只需遍历message数组并查找用户即可。

如果您有大量消息,此解决方案将非常慢。因为它是O(n),它会很好地缩放。

解决方案3 :((有效但响应中发送的数据更多): 它与以前相同,但区别在于向存储用户数据的message对象添加属性。 此解决方案的问题在于,由于一个用户可以发布多封邮件,因此您将拥有重复的数据。

这些是我希望您听到的解决方案。

针对上下文:youtube上的系统设计视频未涉及聊天应用程序的这一部分。如果找到了,请发布链接。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)