mysql - 我有一个聊天应用程序,但到目前为止我没有将消息保存到数据库中。2种方式哪一种更好?
问题描述
现在我有一个名为的表servers
,其中包含所有服务器。每个服务器都有聊天室,其名称和聊天历史记录保存在名为rooms
. 该列包含一组房间对象,如下所示:
[
{
name: 'General',
history: []
},
{
name: 'RandomRoomName',
history: []
}
]
现在,每当用户发送消息时,我只是将其推送到服务器端相应房间的历史记录中,但是,我实际上并没有将其保存在数据库中,因此每当我重新启动服务器时,我都会丢失所有历史记录. 现在我的问题是处理这个问题的更好方法是什么?
- 每当用户发送消息时,我都会获取服务器的房间,将消息推送到正确房间的历史记录中,并使用更新的对象更新数据库。
或者
- 我通过删除 JSON 房间列来重做数据库,创建一个名为的表
rooms
和另一个名为的表messages
,然后在表之间创建相应的关系/关联
老实说,这两种实现都感觉有点奇怪,而且不是真正的可选。
解决方案
你真的需要多张桌子。将内容塞入 JSON 列是不可持续的,并且会产生很多竞争条件问题。随着消息数量的增加,重写的费用也在增加,使得竞争条件更有可能发生。这会导致整个系统在负载下崩溃的死亡螺旋。
选项 2 是唯一现实的方法。这就是您要寻找的关系形式。随着时间的推移,插入成本会相对缓慢地增长,并且通常可以在索引大小变得太大而无法放入内存之前轻松处理多达数十亿条记录。
推荐阅读
- javascript - 引用的 JS 文件不会让 HTML 页面获得比第一个常量更多的信息
- c# - 关闭拥有的表单时启用/禁用所有者表单上的按钮
- node.js - 建立从 apache angular app 到 rest api node js 的连接
- function - 本地声明的 lua 函数是否在每次传递时都会被解析?
- flutter - 有多个英雄在子树中共享相同的标签而不使用 FAB
- laravel - Laravel-auth-timeout - 事件和监听器
- rust - Rust:为什么第一个借用后来用在这里?
- beagleboneblack - 关于 Beaglebone Black CAN 协议设置
- awk - 使用 grep/awk 从文件中提取信息
- maven - 在 Azure devops 中构建失败