gpt4 book ai didi

database-design - Cassandra 按 map 查询

转载 作者:行者123 更新时间:2023-12-05 00:48:12 26 4
gpt4 key购买 nike

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

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 关系)

最佳答案

问题 1

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

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

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';

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

关于database-design - Cassandra 按 map 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com