我不是数据库设计方面的专家,但我有幸发明了一种过滤数据的策略。 鉴于cassandra是使用过的dbms。 我的目标是发明一个缓存系统,该系统能够从数据集中返回一个已经请求的“配置”参数的字段。如果之前从未请求过此明确的“配置”,则会在后台触发新查询,但此机制不属于此主题。
示例表
id = 1, color = red, size = 10, shape = oval, price = 55.2
id = 2, color = blue, size = 5, shape = rectangle, price = 33.9
id = 3, color = red, size = 2, shape = triangle, price = 95.7
...
客户要求一个大小为10的红色和椭圆形物品,并想知道价格。因为请求的参数显然已经在数据库中,所以客户端应该非常快速地得到答案。
我想要的是SQL中的
SELECT price FROM table where color = red AND size = 10 AND shape = oval
在mySQL中不是很关键,但是如何在cassandra中做到这一点?
我是cassandra的新人,并且不知道这个问题的好方法。
我已经知道的是
使用WHERE子句在mySQL中进行过滤是可能的,但速度很慢(对于大型数据库),因为数据库必须运行并使用索引搜索所有字段
cassandra无法过滤未编入索引或主键的一部分的列,除非使用ALLOW FILTER选项,该选项也与关系数据库中的过滤一样慢
cassandra支持地图等类型,因此可以将参数集保存到一个字段,如
id = 1, properties = {color => red, size => 10, shape => oval}, price = 55.2
但不可能将其用作主键的一种。据我所知,收集的索引是可能的,但不推荐,因为它对于足够大的数据库来说也很慢
另一个给定条件是,参数并不总是相同。例如,项目1具有颜色和大小属性,项目8具有形状和颜色属性。在我看来,这说明了非关系架构(?) 事实是,一个“配置”必须只存在一次,所以下面的例子不可能
id = 2535, color = red, size = 10, shape = oval, price = 55.2
id = 3224, color = red, size = 10, shape = oval, price = 33.9
我有一个关于为参数构建哈希的想法,并将其用作主键,但问题是,例如color = red, size = 10, shape = oval
内容与size = 10, shape = oval, color = red
相同但哈希是不同的
也许解决方案很简单或不可能?我搜索了一会儿寻找答案,但没有找到答案。
我不想要一个完整的解决方案,但也许有人可以给我提示或关键字来搜索。
谢谢大家
答案 0 :(得分:0)
在您的示例中,您正在三个字段上执行相等搜索以返回产品ID。
专门为此查询创建一个表。由于配置是唯一的,因此将它们标识为product_id上的分区键和集群。
create table product_by_color_shape_size (
color text,
size int,
shape text,
product_id uuid, //(or int)
price int,
PRIMARY KEY ((color, size, shape),product_id)
);
有关Cassandra中数据建模的更多信息,请查看DS220 Data Modeling course at Datastax Academy。