电子邮件系统

时间:2015-04-27 18:29:36

标签: cassandra data-modeling cassandra-2.0

我需要数据建模帮助,因为我还没有找到解决同样问题的资源。

用户案例类似于电子邮件系统。我想存储用户收到的所有电子邮件的时间表,然后以三种不同的方式将其取回:

  1. 收到的所有电子邮件
  2. 用户已阅读的邮件
  3. 用户尚未阅读的邮件
  4. 我目前的模型如下:

    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;
    

    我的疑问是:

    1. 我是否应该将其作为二级索引读取,因为它会经常更新,并且可以创建逻辑删除 - 每http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html个问题。

    2. 我们可以对二级索引进行不等式检查,因为我发现二级索引上应该存在至少一个相等条件

    3. 如果这不是正确的建模方式,请建议如何支持上述查询。维护三个不同的表格让我担心插入的数量(读取/未读取),因为每天查看的用户数量*电子邮件数量巨大。

1 个答案:

答案 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设置为低并使用频繁压缩可以有所帮助,但是如果您有数千封电子邮件进入,则可能还希望破坏这些分区以避免出现墓碑问题,并获得标记读取。

相关问题