2012-09-06 38 views
1

我希望有一个表的东西如下:卡桑德拉1.1复合密钥,列和滤波CQL 3

CREATE TABLE ProductFamilies (
    ID varchar, 
    PriceLow int, 
    PriceHigh int, 
    MassLow int, 
    MassHigh int, 
    MnfGeo int, 
    MnfID bigint, 
    Data varchar, 
    PRIMARY KEY (ID) 
); 

总共有13个领域。其中大部分代表水桶。数据是产品系列ID的JSON,然后用于后续查询。 鉴于Cassandra的工作方式,引擎盖下的列名将是值。我希望过滤这些。

我希望如下运行查询:

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ? 
  1. 我读的卡桑德拉只能执行WHERE对复合排按键或索引列谓词。这仍然是真的吗?如果是这样,我将不得不使数据部分的PK列<。
  2. 是否仍然需要从左到右包含所有列并且不能跳过?
  3. 我的设计中是否有非最佳点?
  4. 我想添加一列“材料”,这是一个产品系列中可能的材料数组。想想比萨浇头,并查询“哪里的材料('菠萝')”。如果不创建单独的材质倒排索引,然后对上述查询执行手动交集,在Cassandra中是否还有其他[更优雅]的处理方式?
+0

再次,这是我的答案,它仍然是成立的:d http://stackoverflow.com/questions/11825783/cassandra-and-querying-hierarchies/11828376 #11828376 – Tamil

+0

是的......谢谢,但是只能对PK进行过滤的点呢?我知道你的答案是真的;) – IamIC

+0

还有关于#4的任何想法? – IamIC

回答

2

基本上支持你查询你需要有

create column family ProductFamilies with 
comparator='CompositeType(UTF8Type, Int32Type, Int32Type, Int32Type, Int32Type, Int32Type, LongType, UTF8Type)' 
and key_validation_class='UTF8Type' 

CREATE TABLE ProductFamilies (
    ID varchar, 
    PriceLow int, 
    PriceHigh int, 
    MassLow int, 
    MassHigh int, 
    MnfGeo int, 
    MnfID bigint, 
    Data varchar, 
    PRIMARY KEY (ID, PriceLow, PriceHigh, MassLow, MnfGeo, MnfID, Data) 
); 

现在,您可以查询

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ? 

只要不从不放过任何列从左到右[虽然不是过滤器,但至少是*]和所有哟你的值是在列名称而不是值。

一个必须了解关于复合列的更多的是“列片必须是连续的”所以,pricelow> = 10和pricelow < = 40将返回一个连续的片,但过滤的结果与masslow等栏目设置将不会工作,因为它不会导致连续的片段。 BTW pricelow = 10,masslow < = 20,masslow> = 10应该[使用phpcassa测试],因为它会再次产生连续的片段。

否则在您的任何一列上创建一个或多个二级索引。然后,您有权根据列值进行查询,前提是您始终拥有查询中的至少一个索引字段。 http://www.datastax.com/docs/1.1/ddl/indexes

关于你的重大问题,除了倒序索引,如果它将成为我知道的多值列,没有别的办法。

如果@jbellis验证这将是巨大此

+0

你为什么写“PRIMARY KEY(ID,PriceLow, PriceHigh,MassLow,MnfGeo,MnfID,Data)“?至少,数据当然是最终的价值? @jbellis似乎表明不再需要在PK中包含所有查询的列。然后 – IamIC

+0

@IanC我希望如果我理解正确组合柱的鸣叫例子http://www.datastax.com/docs/1.1/ddl/column_family#composite-columns我所提到的应该ü – Tamil

+0

工作,它工作,是的。我只是认为新版本已经放宽了以前的一些要求。 – IamIC

3

如果您指定了正在查找的确切PK,正如您在此处提出的(id IN ...),则可以在其余谓词中使用您喜欢的任何表达式。没有限制。

支持列表集合从1.2.0开始,定于10月底发布。收集内容的索引查询可能支持也可能不支持。

+0

我看到你的电子邮件表示#1 (哪里必须是PK组件)。所以这已经def了。改变了吗? – IamIC

+0

列表集合是否支持push和pop? – IamIC

+0

@jbellis这将是伟大的,如果你能验证我的答案:) – Tamil