我需要数据建模帮助,因为我还没有找到解决同样问题的资源。
用户案例类似于电子邮件系统。我想存储用户收到的所有电子邮件的时间表,然后以三种不同的方式将其取回:
我目前的模型如下:
CREATE TABLE TIMELINE (
userID varchar,
emailID varchar,
timestamp bigint,
read boolean,
PRIMARY KEY (userID, timestamp)
) WITH CLUSTERING ORDER BY (timestamp desc);
CREATE INDEX ON TIMELINE (userID, read);
我需要支持的查询是:
SELECT * FROM TIMELINE where userID = 12;
SELECT * FROM TIMELINE where userID = 12 order by timestamp asc;
SELECT * FROM TIMELINE where userID = 12 and read = true;
SELECT * FROM TIMELINE where userID = 12 and read = false;
SELECT * FROM TIMELINE where userID = 12 and read = true order by timestamp asc;
SELECT * FROM TIMELINE where userID = 12 and read = false order by timestamp asc;
我的疑问是:
我是否应该将其作为二级索引读取,因为它会经常更新,并且可以创建逻辑删除 - 每http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html个问题。
我们可以对二级索引进行不等式检查,因为我发现二级索引上应该存在至少一个相等条件
如果这不是正确的建模方式,请建议如何支持上述查询。维护三个不同的表格让我担心插入的数量(读取/未读取),因为每天查看的用户数量*电子邮件数量巨大。
答案 0 :(得分:2)
您的索引(userID)是高基数 - 您可能希望将其作为您手动与应用程序同步的第二个(或第三个)CF进行管理。
也许像
CREATE TABLE READ_TIMELINE (
userID varchar,
emailID varchar,
timestamp bigint,
PRIMARY KEY (userID, timestamp)
) WITH CLUSTERING ORDER BY (timestamp desc);
CREATE TABLE UNREAD_TIMELINE (
userID varchar,
emailID varchar,
timestamp bigint,
PRIMARY KEY (userID, timestamp)
) WITH CLUSTERING ORDER BY (timestamp desc);
这使您能够满足以下查询:
SELECT * FROM READ_TIMELINE where userID = 12;
SELECT * FROM UNREAD_TIMELINE where userID = 12;
SELECT * FROM READ_TIMELINE where userID = 12 order by timestamp asc;
SELECT * FROM UNREAD_TIMELINE where userID = 12 order by timestamp asc;
也就是说,您使用ORDER BY的自然聚类顺序,您可以使用简单的批处理(一个DELETE,一个INSERT)将电子邮件从UNREAD移动到READ
现在,当你标记阅读的电子邮件时,你最终会在UNREAD表中找到可能很多的墓碑。将GCGS设置为低并使用频繁压缩可以有所帮助,但是如果您有数千封电子邮件进入,则可能还希望破坏这些分区以避免出现墓碑问题,并获得标记读取。