我正在使用NoSQL数据库(如MongoDb / Cassandra)设计聊天应用程序。 对时间最敏感的查询将是查找属于聊天的消息。
我知道将有一个Message
集合,但是不确定如何基于chatId对该集合进行分区。我猜想clustered index
都不适合这种用例。
我们假设Message
将采用以下结构:
{
"chatId" : 123,
"messageId" : 456,
"text" : "Hello World!"
}
我认为唯一的方法是在messageId
上进行分区,并在所有分区中搜索聊天消息。
答案 0 :(得分:1)
我认为,用于消息传递应用程序的传统RDBMS架构应如下所示。
id
参与者编号
id
chat_id
from_id
文字
我猜测您可能由于某些Infra限制而不想使用RDBMS数据库,但是我会认真建议您考虑用例。
如果必须为NoSQL系统(例如Cassandra)设计类似的东西,我将尝试尽可能地对数据进行非规范化,并基于将被最常使用的查询来设计架构。
我将使用架构创建一个表:
chat_id
message_id
message_text
主键(chat_id,message_id)
此处chat_id是分区键,message_id是群集键。您可以通过chat_id查询来获取与分区中的聊天相关的所有消息。另外,我将使用TimeUUID作为消息ID,因为您可以在集群键上运行限制过滤器,这将有助于在聊天中获取最新的N条消息。
如果仍然希望该功能也可以通过消息ID查询消息,则可以在主表上创建一个以message_id作为主键的视图。