麻烦建模卡桑德拉 table

trouble modeling cassandra table

我想用cassandra保存日志,以后再看

这是我到目前为止所做的:

CREATE TABLE logs
(
    id uuid,
    type int,
    start_date timestamp,
    end_date timestamp,
    ip text,
    log_event text,
    user_id text,
    user_agent text,
    PRIMARY KEY (id, type, start_date, user_id)
) WITH CLUSTERING ORDER BY (type ASC, start_date DESC, profil_token ASC);

我需要的总是这种查询:

SELECT * FROM logs WHERE type = 1 AND user_id = 'test' AND start_date = '2017-03-08';

我需要不带id的查询,但是我不能,因为id是我真正的主键

我不知道如何在没有允许过滤的情况下实现这种查询

这取决于您是否需要快速查询。如果您不这样做并且可以忍受扫描所有行,那么 ALLOW FILTERING 就是您的解决方法。

如果您需要更快的查询,您可以重组 table 以便查询前缀,或者您可以创建一个新的 table,对数据进行非规范化以加快查询速度.

我对您的用例了解不多,但将 user_id 作为集群密钥的一部分可能对您有用:

PRIMARY KEY (user_id, start_date, type, id)

但这意味着您无法在不知道 user_id(和其他字段)的情况下通过 id 进行查找。不过,您可以为此添加一个二级索引。

What I need is always this kind of query :

SELECT * FROM logs WHERE type = 1 AND user_id = 'test' AND start_date = '2017-03-08';

如果 always 真的意味着 always 这个 table 模型有点不正确。您的模型应该 始终 查询驱动的 ,因此我将其建模如下:

CREATE TABLE logs
(
    id uuid,
    type int,
    start_date timestamp,
    end_date timestamp,
    event_time timestamp,
    ip text,
    log_event text,
    user_id text,
    user_agent text,
    PRIMARY KEY ((type, user_id, start_date), event_time)
) WITH CLUSTERING ORDER BY (event_time ASC);

当查询此 table 时,您显然需要指定 typeuser_idstart_date(可选)字段 event_time 来过滤结果。

如果您对原始 table 进行建模以满足另一个查询,那么只需像以前的那样添加一个新的 table 并远离 ALLOW FILTERING

它将完美无缺地工作。