Search code examples
database-designcassandraintersectcql3

Cassandra: How to model column family to perform intersect-like queries


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.


Solution

  • 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.