大型聊天应用程序 Mysql 数据库消息存储每条消息 1 行或将整个线程附加到 1 个长文本字段
Large Chat app Mysql db message storage 1 row per message or append whole thread to 1 longtext feild
我们正在使用 mysql 数据库开发大型聊天应用程序,一次只能在 2 个人之间进行对话。
寻找关于哪些数据库模式选项性能更好的意见。
选项 1。传统的方法是在每个消息/响应中插入一行。
简单地插入一个没有事先查找的数据库,但是重建
聊天线程需要 ORDERBY
选项 2。或者将每条消息附加到单个消息字段。
选择会更快,因为不需要 ORDERBY
但是,在每条新消息上都会有一个查找 1st
还有选项 2,数据库中的总行数会更少
有什么想法吗?
这完全取决于您想对该字段执行的操作。不过,在几乎所有情况下,第一个解决方案——每个对话单独一行——是正确的方法。
如果您将对话视为 "blob",则您只想使用第二种方法 -- 所有这些都用一个字段。也就是说,如果您不想 select 特定消息,请在消息内搜索,等等。从本质上讲,该专栏将是消息的存档,而不是像另一专栏一样有用的东西。
我还应该补充一点,在对话中,将消息存储在单个列中会丢失消息发送时间和发送者的信息。当然,您可以尝试封装它,比如使用 JSON 列。但是为什么要打扰呢? SQL 已经有了表示此类信息的良好机制。
我参与了两个大型(数百万活跃用户)系统的设计。两者都使用关系数据库进行存储,一个使用 MySQL。在这两种情况下,每行存储一条消息。 [thread_id, message_timestamp | message_sequential_number | message_auto_increment_id]
的索引对于获取和排序都很好。
请注意,对话可能会发展到 multi-megabytes。如果你将整个对话存储在一行中,你将不得不 read/write 每条新消息的整个内容,或者将整个想法保存在内存中,以便在大多数情况下显示可能最后的 50 条消息。效率低下 200 倍。
另一方面,如果您喜欢冒险,可以看看 Cassandra。它专为在一条记录中高效存储整个对话而设计。
我们正在使用 mysql 数据库开发大型聊天应用程序,一次只能在 2 个人之间进行对话。 寻找关于哪些数据库模式选项性能更好的意见。
选项 1。传统的方法是在每个消息/响应中插入一行。
简单地插入一个没有事先查找的数据库,但是重建
聊天线程需要 ORDERBY
选项 2。或者将每条消息附加到单个消息字段。 选择会更快,因为不需要 ORDERBY 但是,在每条新消息上都会有一个查找 1st
还有选项 2,数据库中的总行数会更少
有什么想法吗?
这完全取决于您想对该字段执行的操作。不过,在几乎所有情况下,第一个解决方案——每个对话单独一行——是正确的方法。
如果您将对话视为 "blob",则您只想使用第二种方法 -- 所有这些都用一个字段。也就是说,如果您不想 select 特定消息,请在消息内搜索,等等。从本质上讲,该专栏将是消息的存档,而不是像另一专栏一样有用的东西。
我还应该补充一点,在对话中,将消息存储在单个列中会丢失消息发送时间和发送者的信息。当然,您可以尝试封装它,比如使用 JSON 列。但是为什么要打扰呢? SQL 已经有了表示此类信息的良好机制。
我参与了两个大型(数百万活跃用户)系统的设计。两者都使用关系数据库进行存储,一个使用 MySQL。在这两种情况下,每行存储一条消息。 [thread_id, message_timestamp | message_sequential_number | message_auto_increment_id]
的索引对于获取和排序都很好。
请注意,对话可能会发展到 multi-megabytes。如果你将整个对话存储在一行中,你将不得不 read/write 每条新消息的整个内容,或者将整个想法保存在内存中,以便在大多数情况下显示可能最后的 50 条消息。效率低下 200 倍。
另一方面,如果您喜欢冒险,可以看看 Cassandra。它专为在一条记录中高效存储整个对话而设计。