0

基本上我有三个属性partIdmeasurementDefvalue。每个部分(partId)由某种类型(measurementDef)的多个度量(值)组成。

格式化为一棵树,它看起来像这样:

-part 1
  |- measurementDef 1 -> 15,86
  |- measurementDef 2 -> 19,54
-part 2
  |- measurementDef 1 -> 21,21
  |- measurementDef 3 -> 65,54
  |- measurementDef 4 -> 12,54
-part 3
   ...

现在我的问题是:我应该如何模拟我的列族来做这样的事情:

SELECT partId
FROM <table>
WHERE measurementDef = xxx AND value > 10
INTERSECT
SELECT partId
FROM <table>
WHERE measurementDef = yyy AND value < 50

换句话说:我想找到所有的部件,其measurementDef xxx 的值高于10,而measurementDef yyy 的值低于50。

4

2 回答 2

1

AFAIK,没有建模方法可以在单个查询中进行交集。我建议使用下表设计:

create table mdefparts(
    mdef int,
    value float,
    parts set<uuid>,
    primary key(mdef, value)
);

然后使用查询:

select parts from mdefparts where mdef=XXX and value > 10;
select parts from mdefparts where mdef=YYY and value < 50;

然后将第一个查询中的所有集合连接到一个集合中(例如,set1)。

将第二个查询中的所有集合加入 set2。

然后将 set1 和 set2 相交。

于 2013-07-18T12:49:22.233 回答
0

可能有替代方案。

如果超过阈值,您可以创建一个在插入期间设置为 1 或 0 的“虚拟”列。然后,像这样创建一个复合列索引:

    CREATE TABLE mdefparts (
            part int,
            name text,
            val double,
            time timeuuid,
            exceeded boolean,
            PRIMARY KEY ((part, name), exceeded, time)
    );

这将像这样工作:

    cqlsh:test> CREATE TABLE mdefparts (
            ... part int,
            ... name text,
            ... val double,
            ... time timeuuid,
            ... exceeded boolean,
            ... PRIMARY KEY ((part, name), exceeded, time)
            ... );
    cqlsh:test> 
    cqlsh:test> insert into mdefparts (part, name, val, time, exceeded) values (0, 'y', 100, 37a5de5c-efb3-11e2-99d0-f23c91aec05e, true);
    cqlsh:test> insert into mdefparts (part, name, val, time, exceeded) values (0, 'x', 100, 37a5de6c-efb3-11e2-99d0-f23c91aec05e, true);
    cqlsh:test> insert into mdefparts (part, name, val, time, exceeded) values (0, 'y', 10, 37a5de7c-efb3-11e2-99d0-f23c91aec05e, false);
    cqlsh:test> insert into mdefparts (part, name, val, time, exceeded) values (1, 'y', 1, 37a5de8c-efb3-11e2-99d0-f23c91aec05e, false);
    cqlsh:test> select * from mdefparts;

     part | name | exceeded | time                                 | val
    ------+------+----------+--------------------------------------+-----
        0 |    y |    False | 37a5de7c-efb3-11e2-99d0-f23c91aec05e |  10
        0 |    y |     True | 37a5de5c-efb3-11e2-99d0-f23c91aec05e | 100
        1 |    y |    False | 37a5de8c-efb3-11e2-99d0-f23c91aec05e |   1
        0 |    x |     True | 37a5de6c-efb3-11e2-99d0-f23c91aec05e | 100

    cqlsh:test> select * from mdefparts where name in ('x','y') and part = 0 and exceeded = true;

     part | name | exceeded | time                                 | val
    ------+------+----------+--------------------------------------+-----
        0 |    x |     True | 37a5de6c-efb3-11e2-99d0-f23c91aec05e | 100
        0 |    y |     True | 37a5de5c-efb3-11e2-99d0-f23c91aec05e | 100

这里的核心思想是将查询建模到列族中。我添加了一个 timeuuid 以允许随着时间的推移进行多次测量。

于 2013-07-18T14:11:00.517 回答