database - 如何在 cassandra 中对表进行建模以根据 where 条件进行选择

标签 database cassandra data-modeling cql

假设我有一张如下所示的表格

create table userevent(id uuid,eventtype text,sourceip text,user text,sessionid text,roleid int,menu text,action text,log text,date timestamp,PRIMARY KEY (id,eventtype));

 id                                   | action | date                     | eventtype | log      | menu      | roleid | sessionid | sourceip     | user
--------------------------------------+--------+--------------------------+-----------+----------+-----------+--------+-----------+--------------+-------
 6ac47b10-d6bb-11e8-bb9a-59dfa00365c6 |  Login | 2018-10-01 04:05:00+0000 |  DemoType |  demolog |  demomenu |      1 |    Demo_1 | 121.11.11.12 |  Aqib
 62119cf0-d6bb-11e8-bb9a-59dfa00365c6 |  Login | 2018-05-31 22:35:00+0000 | DemoType3 | demolog3 | demomenu3 |      3 |    Demo_3 | 121.11.11.12 | Jasim
 5ebb4600-d6bb-11e8-bb9a-59dfa00365c6 |  Login | 2018-05-31 22:35:00+0000 | DemoType3 | demolog3 | demomenu3 |      3 |    Demo_3 | 121.11.11.12 | Jasim

那么如果我想要满足表中 user="something"或 eventtype="something"等的完整数据,我该如何选择。

因为当我尝试使用 where 条件 user='Aqib' 进行简单的选择查询时,它给出了错误。我知道cassandra中的数据建模与sql中的数据建模不同。 任何人都可以帮助我,这是非常值得赞赏的。

如何更改上面的表创建以满足以下查询,

select * from userevent where user='Aqib';
select * from userevent where eventtype='DemoType';
select * from userevent where action='Login'; 

等等

最佳答案

首先要做的事情:Cassandra 查询中没有 OR

如果在查询中您始终限制诸如 usereventtypeaction 之类的字段,那么我建议您为以下内容创建一个单独的表:每一种类型的查询,一个表支持使用user字段进行查询,其中分区键将是user字段,而另一个表则支持使用user字段进行查询。 eventtype作为分区键,支持使用eventtype字段进行查询,以及一张表用于action字段等。 .. 这符合 Cassandra 根据您的查询构建表的数据建模。

所以支持用user查询的表应该是:

CREATE TABLE userTable (
    user text,
    id uuid,
    eventtype text,
    sourceip text,
    sessionid text,
    roleid int,
    menu text,
    action text,
    log text,
    PRIMARY KEY (user)
);

支持使用eventtype查询的表应该是:

CREATE TABLE eventtypeTable (
    eventtype text,
    id uuid,
    user text,
    sourceip text,
    sessionid text,
    roleid int,
    menu text,
    action text,
    log text,
    PRIMARY KEY (eventtype)
);

您可以创建任意数量的表,每个表都支持一个查询。

然后,当您执行查询时(例如在应用程序代码中),如果您知道您具有 user 字段值,则查询 user 所在的表> 字段是分区键并限制user字段值,例如:

select * from userTable where user='Aqib';

否则,如果您知道自己有 eventtype 字段值,那么您应该查询 分区键eventtype 字段的表示例:

select * from eventtypeTable where eventtype='DemoType';

其他字段及其表格也类似。

关于database - 如何在 cassandra 中对表进行建模以根据 where 条件进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52948879/

相关文章:

php - 删除除最后一行之外的重复行

mysql - mysql中的存储过程奇怪的行为

mysql - 供远程 Excel 用户使用的数据库

r - 如何创建模型来对特定组的数据进行分类

database - 如何在 nosql DB 中以最少的重复存储翻译?

mysql - 数据库逻辑问题,为事件设置通行证

Cassandra:无法截断表

python - 在 Python 中为 Cassandra 生成 UUID

Cassandra - 避免 nodetool 清理

mysql - 在为本地位置创建 mysql 表时,最好的主键是什么?