Abh*_*jee 2 database-design cassandra
我有一个包含以下列的表格,
name text, //partition key
tags map<text, text>
Run Code Online (Sandbox Code Playgroud)
我在“标签”列上也有一个二级索引。现在我想查询,
select * from <table_name> where tags contains {'a':'b','x':'y'}
Run Code Online (Sandbox Code Playgroud)
问题 1
对于地图集合,Cassandra 允许在键、值或条目上创建索引(这仅适用于地图)。
因此,首先您要在地图上创建索引:
CREATE INDEX <index_name> ON <table_name> (ENTRIES(<map_column>));
Run Code Online (Sandbox Code Playgroud)
然后你可以查询:
SELECT * FROM <table_name> WHERE <map_column>['<map_key>'] = '<map_value>';
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是冻结您的集合并在其上创建索引:
CREATE INDEX <index_name> ON table (FULL(<map_column>));
Run Code Online (Sandbox Code Playgroud)
然后你可以查询值:
SELECT * FROM <table_name> WHERE <map_column> = ['<value>'...];
Run Code Online (Sandbox Code Playgroud)
我认为上述解决方案不是很好,因为您可以轻松扫描整个集群。您的访问类型将使用和索引而不是分区键。
问题2
另一种解决方案是创建一个这样的表:
CREATE TABLE <table_name> ( key TEXT, value TEXT, name TEXT, PRIMARY KEY ((key, value), name));
Run Code Online (Sandbox Code Playgroud)
键和值列将保存标签的值。它们也将是分区键,因此您可以查询您的数据,例如:
SELECT * FROM <table_name> WHERE key = 'key' AND value = 'value';
Run Code Online (Sandbox Code Playgroud)
您将需要运行多个查询以搜索所有标签,但您可以在应用程序级别聚合结果。