用于检索按日期排序的记录的 Cassandra Schema

Cassandra Schema for retrieving date-ordered records

各位, 我想在 Cassandra 中用 table 解决以下问题。所述服务跟踪用户何时打开资产。在同一资产的后续事件中,我们只需覆盖 accessDate。

示例记录:

{ userId: "string", assetId: "string", accessDate: unixTimestamp }

话虽如此,我们需要满足以下访问要求(每个要求都有自己的可读性要点):

这很容易实现,table可能看起来像:

CREATE TABLE user_assets_tracker (
   userId uuid,
   accessDate timestamp,
   assetId uuid,
   PRIMARY KEY (userid, accessDate, assetId)
);

这使我们能够查询所有资产,以及每个资产的最后访问时间。

SELECT *
FROM user_assets_tracker
WHERE userId = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
>

花花公子。现在更难的部分,我不确定,希望你们能插话:

自然这里的LIMIT不是我们需要的。此外,我们可能需要 2 tables 才能实现此目的。

SELECT *
FROM user_assets_tracker
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
LIMIT 10; ?????  

这可能很简单,具有以下架构:

CREATE TABLE user_assets_tracker (
   userId uuid,
   accessDate timestamp,
   assetId uuid,
   PRIMARY KEY (userid, accessDate, assetId)
);

SELECT *
FROM user_assets_tracker
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
LIMIT 1;

由于 accessDate 在我们的架构中位于 assetId 之前,我也不确定如何执行此操作。另一个 table?

谢谢!!

PS 看来 SASI Index 可能是解决方案

尽管您总是选择 assetid orderby accessDate desc.
使用 order by accessDate desc

定义您的架构
CREATE TABLE user_assets_tracker (
    userid uuid,
    accessdate timestamp,
    assetid uuid,
    PRIMARY KEY (userid, accessdate, assetid)
) WITH CLUSTERING ORDER BY (accessdate DESC, assetid ASC);

现在您不需要每次都按 accessDate desc 指定顺序。默认情况下,它会按 accessDate desc

对您的数据进行排序
  • 显示用户在过去 30 天内添加的所有资产。

首先获取 30 天前的时间戳。
让我们 30 天前的当前时间戳是:2017-02-05 12:00:00+0000
现在您可以查询:

SELECT * FROM user_assets_tracker WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND accessdate >= '2017-02-05 12:00:00+0000'
  • 检索特定 userId + assetId 的完整记录

如果您使用的是 Cassandra 3.0 或更高版本,您可以使用 Materialized Views
创建实体化视图:

CREATE MATERIALIZED VIEW user_assets AS
    SELECT *
    FROM user_assets_tracker
    WHERE userid IS NOT NULL AND assetid IS NOT NULL AND accessdate IS NOT NULL
    PRIMARY KEY (userid, assetid, accessdate);

现在如果你想获取所有包含 userid 和 assetid 的数据,这里是查询

SELECT * FROM user_assets WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND assetid = 1d45e6c2-02a1-11e7-aac5-b9ab92bee74c;

还有一个问题,如果单个用户插入大量数据,你应该添加用户id作为分区的时间桶key.For更多查看答案