【发布时间】:2015-09-14 00:31:36
【问题描述】:
对不起,如果它是重复的,我在这里发现了一些关于时间范围的问题,但我的情况似乎有点不同,尚未讨论。
我想存储相当大的数据块(bins)(blob - 2-4Mb,这是“黑盒数据”,我无法更改其布局)以使用间隔键访问:
...
primary key ( bin_id int, from_item_id int, to_item_id int )
...
能够选择项目范围,就像在这个伪代码中选择包含项目间隔的所有块[110, 200]:
select chunk from tb1 where chunk_id = 100500 and from_item_id >= 110 and to_item_id <= 200;
尝试运行这样的查询直接以错误结束:
code=2200 [Invalid query] message="PRIMARY KEY column "to_item_id" cannot be restricted (preceding column "from_item_id" is restricted by a non-EQ relation)"
目前我找到的唯一解决方案是使用从 item_id 到 bin_id 的反向映射来实现附加表 (tb_map),并使用 select 使查询看起来像这样:
...
– in tb_map
primary key (dummy_id, item_id)
...
select bin_id from tb_map where dummy_id = SOME_MAGIK and item_id >= 110 and item_id <= 200;
然后使用 bin_id 从带有 EQ 或 IN 运算符的 tb1 中检索块,如下所示:
select * from tb1 where bin_id in (...);
但由于插入性能问题,我不能使用此模型(应用程序应避免对附加表进行多次插入,并应避免维护额外的数据结构,但应该“像钉子一样简单”)。
留在一张桌子(或几张简单的桌子)内有什么简单的解决方案吗?我不知道如何在 C* 中建模这种行为(可能应该使用切片?),本地 C* 专家可以提供任何提示吗?
我正在使用 CQL 3.1
【问题讨论】:
标签: cassandra data-modeling cql cql3