用于检索按日期排序的记录的 Cassandra Schema
Cassandra Schema for retrieving date-ordered records
各位,
我想在 Cassandra 中用 table 解决以下问题。所述服务跟踪用户何时打开资产。在同一资产的后续事件中,我们只需覆盖 accessDate。
示例记录:
{ userId: "string", assetId: "string", accessDate: unixTimestamp }
话虽如此,我们需要满足以下访问要求(每个要求都有自己的可读性要点):
- 能够 return 用户在什么时间打开的所有资产。
这很容易实现,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;
>
花花公子。现在更难的部分,我不确定,希望你们能插话:
- 显示用户在过去 30 天内添加的所有资产。
自然这里的LIMIT不是我们需要的。此外,我们可能需要 2 tables 才能实现此目的。
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 之前,我也不确定如何执行此操作。另一个 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更多查看答案
各位, 我想在 Cassandra 中用 table 解决以下问题。所述服务跟踪用户何时打开资产。在同一资产的后续事件中,我们只需覆盖 accessDate。
示例记录:
{ userId: "string", assetId: "string", accessDate: unixTimestamp }
话虽如此,我们需要满足以下访问要求(每个要求都有自己的可读性要点):
- 能够 return 用户在什么时间打开的所有资产。
这很容易实现,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;
>
花花公子。现在更难的部分,我不确定,希望你们能插话:
- 显示用户在过去 30 天内添加的所有资产。
自然这里的LIMIT不是我们需要的。此外,我们可能需要 2 tables 才能实现此目的。
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 之前,我也不确定如何执行此操作。另一个 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更多查看答案