民间, 我想在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;
>
丹迪。现在,我不确定的那些更难的东西,希望你们大家都能参与其中:
当然,LIMIT不是我们所需要的。此外,我们可能需要有2个表才能实现这一目标。
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之前,我不知道如何做到这一点。另一张桌子?
谢谢!
PS似乎SASI Index可能是解决方案
答案 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天前的时间戳是: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'
如果您使用的是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