问题描述
我将用一个例子来说明我的问题。
您有一个群组聊天表,用于存储有关群组聊天的数据。
-------------------+
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
- 这是建立数据库的正确方法吗?
- 没有关节或外键。加载所有消息和用户数据并使其具有某种格式的最有效方法是什么,该格式使您可以构造一个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 (将#修改为@)