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-name
和the-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 中的数据建模冲突的主要内容,如果未能解决你的问题,请参考以下文章