Cassandra 如何为收件箱建模

Cassandra 如何为收件箱建模,cassandra,data-modeling,Cassandra,Data Modeling,如果我有一个用于消息传递的web应用程序,并且我希望用户能够看到按日期排序的所有消息,或者看到与特定联系人交换的消息(再次按日期排序),那么我该如何建模数据呢 我是否应该有两个表,分别称为“全局收件箱”和“联系人收件箱”,在这两个表中我可以将每封邮件都添加到这两个表中 例如: CREATE TABLE global_inbox(user_id int, timestamp timestamp, message text, PRIMARY KE

如果我有一个用于消息传递的web应用程序,并且我希望用户能够看到按日期排序的所有消息,或者看到与特定联系人交换的消息(再次按日期排序),那么我该如何建模数据呢

我是否应该有两个表,分别称为“全局收件箱”和“联系人收件箱”,在这两个表中我可以将每封邮件都添加到这两个表中

例如:

CREATE TABLE global_inbox(user_id int, timestamp timestamp, 
                          message text, PRIMARY KEY(user_id, timestamp)

CREATE TABLE inbox(user_id int, contact_id int, 
                   timestamp timestapm, message text, 
                   PRIMARY KEY(user_id, contact_id, timestamp)

这意味着每封邮件应复制4次,发送方复制2次,接收方复制2次。听起来合理吗?

就查询性能而言,是的,对我来说很好。ApacheCassandra实际上是为这种数据建模而内置的。我们构建表来满足查询。这就是卡桑德拉范式中称为“非规范化”的过程。这将提高查询的性能。您有重复的数据,但主要目标是快速查询。

就查询性能而言,是的,这听起来对我很好。ApacheCassandra实际上是为这种数据建模而内置的。我们构建表来满足查询。这就是卡桑德拉范式中称为“非规范化”的过程。这将提高查询的性能。您有重复的数据,但主要目标是快速查询。

是的,这是合理的。
你需要一些修改

  • 收件箱表:如果一个用户有许多联系人,并且每个联系人都发送消息,那么大量数据将插入到单个分区(用户id)中。因此,将联系人id添加到分区键
更新的架构:

CREATE TABLE inbox (
     user_id int, 
     contact_id int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id, contact_id), timestamp)
);
CREATE TABLE global_inbox (
     user_id int,
     year int,
     month int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id,year,month), timestamp)
);
  • 全局收件箱:虽然它是全局收件箱,但可以将大量数据插入单个分区(用户id)。所以,添加更多的键到分区键到更多的分发
更新的架构:

CREATE TABLE inbox (
     user_id int, 
     contact_id int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id, contact_id), timestamp)
);
CREATE TABLE global_inbox (
     user_id int,
     year int,
     month int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id,year,month), timestamp)
);
如果一周内单个分区中有大量数据,您还可以在这里向分区键添加week。或者,如果您认为一年内插入的数据不多,则从分区键中删除月份。

是的,这是合理的。
你需要一些修改

  • 收件箱表:如果一个用户有许多联系人,并且每个联系人都发送消息,那么大量数据将插入到单个分区(用户id)中。因此,将联系人id添加到分区键
更新的架构:

CREATE TABLE inbox (
     user_id int, 
     contact_id int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id, contact_id), timestamp)
);
CREATE TABLE global_inbox (
     user_id int,
     year int,
     month int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id,year,month), timestamp)
);
  • 全局收件箱:虽然它是全局收件箱,但可以将大量数据插入单个分区(用户id)。所以,添加更多的键到分区键到更多的分发
更新的架构:

CREATE TABLE inbox (
     user_id int, 
     contact_id int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id, contact_id), timestamp)
);
CREATE TABLE global_inbox (
     user_id int,
     year int,
     month int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id,year,month), timestamp)
);
如果一周内单个分区中有大量数据,您还可以在这里向分区键添加week。或者,如果您认为一年中插入的数据不多,则从分区键中删除月份