如何建模收件箱
How to model inbox
如果我有一个用于消息传递的 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次。听起来合理吗?
就查询性能而言,是的,这对我来说听起来不错。 Apache cassandra 确实是为这种数据建模而内置的。我们构建 table 来满足查询。这就是 Cassandra 范式中称为 'Denormalization' 的过程。这将提高查询性能。您有重复数据,但主要目标是快速查询。
是的,这是合理的。
你需要一些修改。
- 收件箱table : 如果一个用户有很多联系人并且每个联系人都发送消息,那么大量的数据将被插入到一个分区中(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)
);
如果一周内单个分区中有大量数据,您还可以在这里添加周到分区键。如果您认为一年内插入的数据不多,也可以从分区键中删除月份。
如果我有一个用于消息传递的 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次。听起来合理吗?
就查询性能而言,是的,这对我来说听起来不错。 Apache cassandra 确实是为这种数据建模而内置的。我们构建 table 来满足查询。这就是 Cassandra 范式中称为 'Denormalization' 的过程。这将提高查询性能。您有重复数据,但主要目标是快速查询。
是的,这是合理的。
你需要一些修改。
- 收件箱table : 如果一个用户有很多联系人并且每个联系人都发送消息,那么大量的数据将被插入到一个分区中(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)
);
如果一周内单个分区中有大量数据,您还可以在这里添加周到分区键。如果您认为一年内插入的数据不多,也可以从分区键中删除月份。