【问题标题】:Cassandra query by mapCassandra 按地图查询
【发布时间】:2018-10-05 17:06:53
【问题描述】:

我有一个包含以下列的表格,

name text, //partition key
tags map<text, text>

我在“标签”列上也有一个二级索引。现在我想查询,

select * from <table_name> where tags contains {'a':'b','x':'y'}
  1. 有可能吗?如果没有,我可以只用“包含{'a':'b'}”进行查询吗?
  2. 这是一个糟糕的设计吗?如果是,如何纠正这个问题? (注意:名称与标签有 1->n 关系)

【问题讨论】:

    标签: database-design cassandra


    【解决方案1】:

    问题 1

    对于地图集合,Cassandra 允许在键、值或条目上创建索引(这仅适用于地图)。

    所以,首先您要在地图上创建索引:

    CREATE INDEX <index_name> ON <table_name> (ENTRIES(<map_column>));
    

    那么你可以查询:

    SELECT * FROM <table_name> WHERE <map_column>['<map_key>'] = '<map_value>';
    

    另一种解决方案是冻结您的收藏并在其上创建索引:

    CREATE INDEX <index_name> ON table (FULL(<map_column>));
    

    然后你可以查询值:

    SELECT * FROM <table_name> WHERE <map_column> = ['<value>'...];
    

    我认为上述解决方案不是很好,因为您可以轻松扫描整个集群。您的访问类型将使用索引而不是分区键。


    问题 2

    另一种解决方案是创建这样的表:

    CREATE TABLE <table_name> ( key TEXT, value TEXT, name TEXT, PRIMARY KEY ((key, value), name));
    

    键和值列将保存标签的值。它们也将是分区键,因此您可以像这样查询数据:

    SELECT * FROM <table_name> WHERE key = 'key' AND value = 'value';
    

    您需要运行多个查询才能搜索所有标签,但您可以在应用程序级别汇总结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2015-06-10
      • 2019-07-21
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多