Cassandra 中的数据建模冲突

Posted

技术标签:

【中文标题】Cassandra 中的数据建模冲突【英文标题】:Data modelling conflicts in Cassandra 【发布时间】:2018-03-27 08:32:42 【问题描述】:

我使用的架构如下:

CREATE TABLE mytable(
id varchar,
date date,
name varchar,
PRIMARY KEY ((date),name, id)
) WITH CLUSTERING ORDER BY (name desc);

我的用例有 2 个查询:

    获取给定name的所有记录 删除给定date的所有记录。

由于我们无法在没有指定分区键的情况下删除记录,因此我的分区键仅固定为 date,并且不能将其他列添加到分区键,因为在删除。

但是要使用name 获取记录,我需要使用ALLOW FILTERING,因为我需要扫描上述架构的整个表,这会导致性能问题。

您能否提出一个更好的方法,以便我可以跳过ALLOW FILTERING 也可以通过date 兼容删除。

【问题讨论】:

您无法使用单个表执行此操作。您要么需要使用 ALLOW FILTERING 并遭受较差的性能和不可扩展性,要么需要一个额外的表。 如果我引入另一个表,我将如何从获取查询的结果中删除删除日期的记录。你能解释一下额外的表模式吗? 【参考方案1】:

您可以使用索引: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useSecondaryIndex.html

但是您必须小心,根据桌子的大小可能会出现问题。您应该阅读这篇文章以获取更多信息: https://pantheon.io/blog/cassandra-scale-problem-secondary-indexes

【讨论】:

【参考方案2】:

您需要一个额外的表格来支持您的要求。 您的主要查询是检索给定名称的记录。为此,您应该使用 mytable 如下(注意主键):

CREATE TABLE mytable(
id varchar,
date date,
name varchar,
PRIMARY KEY ((name),date, id)
) WITH CLUSTERING ORDER BY (date desc);

此表可让您使用(查询 1)检索给定名称的数据:

 SELECT * FROM mytable WHERE name='bob';

现在,您希望能够按日期删除。为此,您需要以下附加表:

CREATE TABLE mytable_by_date(
id varchar,
date date,
name varchar,
PRIMARY KEY ((date), name, id)
) WITH CLUSTERING ORDER BY (name);

此表可让您找到给定日期的名称(和 ID):

SELECT * from mytable_by_date WHERE date='your-date';

我不知道您的业务需求,因此您的此查询可能会返回 0、1 或更多结果。一旦你有了它,你就可以对第一个和第二个表发出删除(也许使用记录的批处理来实现原子性?)

DELETE * from mytable_by_date WHERE date='your-date' and name='the-name' and id='the-id'
DELETE * from mytable WHERE name='the-name' and ...

总体而言,您可能需要根据您的业务需求进行调整(名称是否唯一,id 是否强制执行唯一性等...)

希望对你有帮助!

【讨论】:

不清楚如何获取the-namethe-id,因为我在删除时只有your-date 你从查询SELECT * from mytable_by_date WHERE date='your-date';得到它 您能否编写有效的语法来“获取”一个查询的值并在另一个查询中使用它们,因为我仍然不清楚。 与可以将其编写为单个查询的 SQL / 传统 RDBMS 不同,CQL 非常有限。这意味着您需要编写多个查询,而您的应用程序需要完成这项工作。在这种情况下,您需要使用 SELECT * from mytabpe_by_date WHERE date=... 来检索名称和 ID。然后,使用结果,您的应用程序需要发出 DELETE 语句。 我们是否需要像这样使用驱动程序来做到这一点:***.com/questions/30373893/… 或者我们是否有另一种方法来使用第一个查询获得的名称和 id 并在另一个查询中使用它。如果可能,请使用正确的语法进行描述。

以上是关于Cassandra 中的数据建模冲突的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 中的数据建模,列可以是文本或数字

Cassandra中的数据建模简单表不起作用

Cassandra 数据建模分区键

具有非规范化的 cassandra 数据建模

围绕电子邮件系统的 Cassandra 数据建模

在 cassandra 中使用可能的空值对嵌套数据进行建模