如果我有一个用于消息传递的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份用于收件人。听起来合理吗?
答案 0 :(得分:2)
是的,这是合理的 你需要一些修改。
更新了架构:
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)
);
如果您在一周内的单个分区中拥有大量数据,那么您还可以添加周分区键。如果您认为一年内不会插入太多数据,请从分区键中删除月份。
答案 1 :(得分:1)
在查询表现方面,是的,这对我来说听起来不错。 Apache cassandra真正内置于这种数据建模中。我们构建表来满足查询。这是Cassandra范式中称为“非规范化”的过程。这将提高查询性能。您有重复的数据,但主要目标是快速查询。