如何建模收件箱

时间:2017-03-21 01:04:14

标签: cassandra data-modeling

如果我有一个用于消息传递的Web应用程序,我将如何建模数据,我希望用户能够查看按日期排序的所有消息,或者查看与特定联系人交换的消息,再按日期排序。

我应该有两个表,名为" global_inbox"和" contacts_inbox"我会在哪里添加每条消息?

例如:

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份用于收件人。听起来合理吗?

2 个答案:

答案 0 :(得分:2)

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

  • 收件箱表:如果用户有多个联系人和每个联系人发送消息,则会将大量数据插入到单个分区(user_id)中。所以将contact_id添加到分区键。

更新了架构:

CREATE TABLE inbox (
     user_id int, 
     contact_id int, 
     timestamp timestamp, 
     message text, 
     PRIMARY KEY((user_id, contact_id), timestamp)
);
  • global_inbox:虽然它是全局收件箱,但可以将大量数据插入到单个分区(user_id)中。因此,为分区键添加更多键以进行更多分发。

更新了架构:

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

如果您在一周内的单个分区中拥有大量数据,那么您还可以添加周分区键。如果您认为一年内不会插入太多数据,请从分区键中删除月份。

答案 1 :(得分:1)

在查询表现方面,是的,这对我来说听起来不错。 Apache cassandra真正内置于这种数据建模中。我们构建表来满足查询。这是Cassandra范式中称为“非规范化”的过程。这将提高查询性能。您有重复的数据,但主要目标是快速查询。