【发布时间】:2015-09-18 21:40:04
【问题描述】:
我不是数据库设计专家,但我有幸发明了一种过滤数据的策略。 给定的是 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 的红色椭圆形物品,并想知道价格。因为请求的参数显然已经在db中了,所以客户端应该很快就能得到答案。
我想要的是 SQL 之类的东西
SELECT price FROM table where color = red AND size = 10 AND shape = oval
在 mySQL 中不是很关键,但是在 cassandra 中如何做到这一点?
我是 cassandra 的新手,不知道有什么好的解决方案。
我已经知道的是
可以在 mySQL 中使用 WHERE 子句进行过滤,但速度较慢(对于大型数据库),因为数据库必须运行并搜索所有字段,而不是使用索引
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 相同,但散列不同。
也许解决方案非常简单或不可能?我搜索了一段时间,但没有找到答案。
我不想要一个完整的解决方案,但也许有人可以给我提示或要搜索的关键字。
谢谢大家
【问题讨论】: