Basically I have three attributes: partId
, measurementDef
and value
.
Each part (partId) consists of multiple measures (value) of a certain type (measurementDef).
Formatted as a tree it would look something like this:
-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
...
Now my question is: How should I model my column family to do something like this:
SELECT partId
FROM <table>
WHERE measurementDef = xxx AND value > 10
INTERSECT
SELECT partId
FROM <table>
WHERE measurementDef = yyy AND value < 50
In other words: I want to find all parts, whose value for measurementDef xxx is higher 10 and whose value for measurementDef yyy is lower 50.
AFAIK, there is no modelling approach to make intersection within single query. I suggest to use following table design:
create table mdefparts(
mdef int,
value float,
parts set<uuid>,
primary key(mdef, value)
);
Then use queries:
select parts from mdefparts where mdef=XXX and value > 10;
select parts from mdefparts where mdef=YYY and value < 50;
Then join all sets from the first query into one set (say, set1).
Join all sets from the second query into set2.
Then just intersect set1 and set2.