非主键上的NoSQL分区

时间:2019-07-13 10:18:26

标签: mongodb cassandra nosql partitioning

我正在使用NoSQL数据库(如MongoDb / Cassandra)设计聊天应用程序。 对时间最敏感的查询将是查找属于聊天的消息。

我知道将有一个Message集合,但是不确定如何基于chatId对该集合进行分区。我猜想clustered index都不适合这种用例。

我们假设Message将采用以下结构:

{
  "chatId"  : 123,
  "messageId"      : 456,
  "text"    : "Hello World!"
}

我认为唯一的方法是在messageId上进行分区,并在所有分区中搜索聊天消息。

1 个答案:

答案 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作为主键的视图。