如何在Cassandra中建模表以选择带条件的位置

时间:2018-10-23 12:16:45

标签: 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”之类的完整数据。

因为当我尝试使用条件为user ='Aqib'的简单选择查询时,其给出了错误。我知道cassandra中的数据建模与sql中的不同。 任何人都可以帮助我,非常感谢。

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

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

1 个答案:

答案 0 :(得分:2)

第一件事:Cassandra查询中没有OR

如果在查询中始终限制usereventtypeaction之类的字段,那么建议您为每种类型的查询创建一个单独的表,一个表支持使用user字段进行查询,其中partition key将是user字段,并使用另一个以eventtype作为partition key的表来支持使用{{ 1}}字段,以及eventtype字段的一个表,等等...这符合Cassandra基于您的查询构建表的数据建模。

因此,支持使用action查询的表应为:

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字段为{{ 1}}并限制user字段值,例如:

partition key

否则,如果您知道自己拥有user字段值,则应该查询select * from userTable where user='Aqib'; eventtype字段的表,例如:

partition key

,其他字段及其表也是如此。