查看此问题的一种方法是根据您尝试建模的实体的关系。例如,星系有恒星,恒星有行星,行星有卫星;它们都有一定的特征(轨道周期以天为单位,半径以公里为单位)。你可以这样建模:
CREATE TABLE galaxyobjects (
galaxy text,
star text,
planet text,
moon text,
spectralclass text,
radiuskm double,
orbitalperioddays double,
PRIMARY KEY ((galaxy, star), planet, moon)
);
当然,谱类实际上只适用于star 列,但在非规范化模型中,您会在每一行上看到它。
插入一些数据后,我的表格可能是这样的:
aploetz@cqlsh:stackoverflow> SELECT * FROM galaxyobjects;
galaxy | star | planet | moon | orbitalperioddays | radiuskm | spectralclass
-----------+------------+-------------+--------+-------------------+----------+---------------
Milky Way | Kepler-186 | Kepler-186f | n/a | 129.9459 | 7072 | M1
Milky Way | Sun | Earth | Moon | 27.3 | 3474.8 | G2
Milky Way | Sun | Earth | n/a | 365.256 | 6371 | G2
Milky Way | Sun | Jupiter | Europa | 3.551 | 1560.8 | G2
Milky Way | Sun | Jupiter | Io | 1.77 | 1821.6 | G2
Milky Way | Sun | Jupiter | n/a | 4332.59 | 71492 | G2
(6 rows)
现在,如果我想查询木星及其卫星:
aploetz@cqlsh:stackoverflow> SELECT * FROM galaxyobjects
WHERE galaxy='Milky Way' AND star='Sun' and planet='Jupiter';
galaxy | star | planet | moon | orbitalperioddays | radiuskm | spectralclass
-----------+------+---------+--------+-------------------+----------+---------------
Milky Way | Sun | Jupiter | Europa | 3.551 | 1560.8 | G2
Milky Way | Sun | Jupiter | Io | 1.77 | 1821.6 | G2
Milky Way | Sun | Jupiter | n/a | 4332.59 | 71492 | G2
(3 rows)
注意事项:
- 我将
galaxy 和star 指定为分区键。由于 Cassandra 每个分区最多有 20 亿列,并且一个星系肯定有数十亿个物体在其中运行,我认为额外的分区 star 是必要的。请注意,在此模型中,您必须在每个查询中同时指定 galaxy 和 star。
- 我想您可以扩展分区键以包含
planet,但是您将无法查询 star 的行星。
- 在此模型中,
planet 和moon 是聚类键,因此不需要在每个查询中指定它们。但是,您不能跳过它们,因此您将无法(在 WHERE 子句中)指定 moon 而不指定 planet。
- 在单独查询行星(没有月亮)时,我的数据建模感觉不太喜欢使用
n/a 作为聚类键。所以也许有更好的方法来建模。也许一组卫星会更合适?