如何在cassandra中为表建模,以便使用where条件进行选择

pdkcd3nj  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(329)

假设我有一张和下面一样的table

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'的简单select查询时,它的给定错误。我知道cassandra中的数据建模与sql中的不同。任何人都可以帮助我,这是非常可观的。
如何更改上面的表创建以满足下面的查询,

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

ff29svar

ff29svar1#

第一件事:没有 OR 在cassandra查询中
如果在你的查询中你总是限制一个像 user 或者 eventtype 或者 action 然后我建议您为每种类型的查询创建一个单独的表,一个支持使用 user 字段中的 partition key 会是 user 字段和另一个表 eventtype 作为 partition key 支持使用 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 字段是 partition key 并限制 user 字段值,例如:

select * from userTable where user='Aqib';

如果你知道你有 eventtype 字段值,则应查询 partition keyeventtype 字段,例如:

select * from eventtypeTable where eventtype='DemoType';

对于其他字段及其表也是如此。

相关问题