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