cassandra 如果存在其他可确保记录唯一性的聚类键,如何按日期列排序

xriantvc  于 11个月前  发布在  Cassandra
关注(0)|答案(1)|浏览(212)

我正在写一个测试项目的主题领域“密码存储系统”。

create table users
(
    login               text primary key,
    access_token        text,
    access_token_expire timestamp,
    password            text
);
create table credentials
(
    user_login              text,
    resource_name           text,
    resource_login          text,
    changed_at              timestamp,
    created_at              timestamp,
    id                      uuid,
    password_security_level int,
    resource_password       text,
    primary key (user_login, resource_name, resource_login)
)
create table credentials_history
(
    credential_id     uuid,
    resource_password text,
    changed_at        timestamp,
    primary key (credential_id, changed_at)
);

credentials表出现了问题,问题是我选择了user_login,resource_name,resource_login字段作为主键的一部分,因为它们将保证某个用户在某个资源上的某个帐户的唯一性,我将能够通过帐户的唯一字段进行搜索,但我希望这些数据以降序排列created_at,然后在应用程序中使用分页将它们分部分发布。我想到的唯一选择是制作两个表而不是一个表,并将它们命名为credentials_unique & credentials_sorted_by_created_at,credentials_unique我将用作现在的凭据,即,在创建之前检查这样的用户帐户是否已经存在,并保证唯一性,在第二个表credentials_sorted_by_created_at中我将插入相同的内容,但是已经有了PartitionKey(user_login)和PartitioningKey(created_at)
请告诉我,更好的选择,这是在所有实践,还是有一个问题,在一开始?
一个类似的故事与credentials_history,在理论上我将然后有表
用于检查此类帐户是否已存在的表(名称混淆了我)credentials_by_resource_name_and_resource_login PK((user_login),resource_name,resource_login)
表以按排序顺序向用户显示信息。凭据PK((user_login),created_at)
用于检查此类密码是否已在此类帐户上使用的表credentials_history_by_password PK((credential_id),resource_password)
用于按排序顺序向用户显示信息的表。credentials_history PK((credential_id),changed_at)

yshpjwxd

yshpjwxd1#

如果您认为created_at可以保证/增强该表中记录的唯一性,则可以将created_at作为集群键的一部分,如下所示,

CREATE TABLE IF NOT EXISTS
...
PRIMARY KEY((user_login), resource_name, resource_login, created_at)
WITH CLUSTERING ORDER BY(resource_name ASC, resource_login ASC, created_at DESC)
...

字符串
另一种方法是创建一个实体化视图,如下所示:

--Source Table--
CREATE TABLE test.so_231206 (
    a text,
    b text,
    c text,
    d timestamp,
    PRIMARY KEY (a, b, c)
) WITH CLUSTERING ORDER BY (b ASC, c ASC);


MV看起来就像

--MV--
CREATE MATERIALIZED VIEW test.so_231206_mv AS
    SELECT a, b, c, d
    FROM test.so_231206
    WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d IS NOT NULL
    PRIMARY KEY (a, b, c, d)
    WITH CLUSTERING ORDER BY (b ASC, c ASC, d DESC);


你只需要写入源表,

cqlsh:test> insert into so_231206 (a,b,c,d) VALUES ( '1','1','1',totimestamp(now()));
cqlsh:test> insert into so_231206 (a,b,c,d) VALUES ( '2','2','2',totimestamp(now()));


从源阅读:

cqlsh:test> select * from so_231206;

 a | b | c | d
---+---+---+---------------------------------
 2 | 2 | 2 | 2023-12-07 13:07:25.067000+0000
 1 | 1 | 1 | 2023-12-07 13:06:53.822000+0000

(2 rows)


现在,从MV中阅读:

cqlsh:test> select * from so_231206_mv ;

 a | b | c | d
---+---+---+---------------------------------
 2 | 2 | 2 | 2023-12-07 13:07:25.067000+0000
 1 | 1 | 1 | 2023-12-07 13:06:53.822000+0000

(2 rows)


这将像下面这样工作,即使你的源表有dnull值:

cqlsh:test> insert into so_231206 (a,b,c) VALUES ('3','3','3');
cqlsh:test> select * from so_231206;

 a | b | c | d
---+---+---+---------------------------------
 3 | 3 | 3 |                            null
 2 | 2 | 2 | 2023-12-07 13:07:25.067000+0000
 1 | 1 | 1 | 2023-12-07 13:06:53.822000+0000

(3 rows)
cqlsh:test> select * from so_231206_mv ;

 a | b | c | d
---+---+---+---------------------------------
 2 | 2 | 2 | 2023-12-07 13:07:25.067000+0000
 1 | 1 | 1 | 2023-12-07 13:06:53.822000+0000

(2 rows)


正如您所看到的,它自动按d降序排序,正如我们在模式创建阶段所述。
在使用the guides on MV usage之前一定要阅读它。我也鼓励你利用this free browser-based data modeling by example course来增强你对CQL数据建模的知识和理解。

相关问题