我目前正在为一个网络应用程序开发一个聊天功能。我们的技术堆栈包括后端的Ruby on Rails,API层的GraphQL和前端的Next.js。
我们的数据库中有两个相关的表:
|聊天|
| - -----|
| id|
| 创建者ID|
| 创建于|
| 更新_at|
| 标题|
| 最后消息|
|聊天_消息|
| - -----|
| id|
| 聊天ID|
| 用户id|
| 正文|
| 创建于|
| 更新_at|
我的目标是按照最近的活动**(即每个聊天中的最新消息)确定的顺序获取客户端的聊天记录。
我目前的方法是向Chats表添加一个last_message_at
字段,每次发送新消息时都会更新该字段。这样,我们就可以按此字段对聊天进行排序,并获得所需的排序。
我的同事反对增加一个专栏。他建议在两个表之间使用分组查询来获得相同的结果。
我很想听听你对这些方法的看法。添加last_message_at
列并在每个新消息上更新它是否更有效,或者我们应该使用分组查询来按最新消息对聊天进行排序?
潜在的性能影响是什么,特别是在可伸缩性方面
谢谢你!
1条答案
按热度按时间pzfprimi1#
为什么不检查给定聊天的
created_at
列?该列描述消息被发送并保存到DB(或相反)。例如,您与id: 1
聊天,您只需查询所有包含chat_id: 1
的聊天消息并命令它们created_at desc:ChatMessage.where(chat_id: 1).order(created_at: :desc)
。如果要在SQL中执行此操作,可以用途:SELECT * FROM "chat_messages" WHERE chat_id = 1 ORDER BY created_at desc
。也许我把问题搞错了,chat_message创建后不一定会发送。