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

时间:2017-03-06 18:34:56

标签: cassandra cql cql3

民间,   我想在Cassandra中用一张桌子来解决以下问题。当用户打开资产时,所述服务跟踪。在对同一资产的后续事件中,我们只是覆盖了accessDate。

示例记录:

  

{userId:“string”,assetId:“string”,accessDate:unixTimestamp}

有了这个说法,我们需要满足以下访问要求(每个要求都有自己的可读性要点):

  • 能够返回用户已打开的所有资产,以及在什么时间。

这很容易实现,表格看起来像:

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;
>

丹迪。现在,我不确定的那些更难的东西,希望你们大家都能参与其中:

  • 显示过去30天内用户添加的所有资产。

当然,LIMIT不是我们所需要的。此外,我们可能需要有2个表才能实现这一目标。

SELECT *
FROM user_assets_tracker
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
LIMIT 10; ?????  
  • 显示用户最后访问的项目。我认为这个更容易,LIMIT 1解决了这个问题。

这可能很简单,使用此架构:

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;
  • 检索特定userId + assetId
  • 的完整记录

由于accessDate位于我们架构中的assetId之前,我不知道如何做到这一点。另一张桌子?

谢谢!

PS似乎SASI Index可能是解决方案

1 个答案:

答案 0 :(得分:2)

虽然您总是通过accessDate desc选择assetid order 通过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;

另外一件事是,如果将大量数据插入到单个用户中,则应添加时间桶,其中userid作为分区键。更多检查答案https://stackoverflow.com/a/41857183/2320144