查看此問題的一種方法是使用您試圖建模的實體的關係。例如,星系有星星,星星有行星,行星有月亮;它們都有一定的特徵(軌道週期以天爲單位,半徑以公里爲單位)。你可以模型與此類似:
CREATE TABLE galaxyobjects (
galaxy text,
star text,
planet text,
moon text,
spectralclass text,
radiuskm double,
orbitalperioddays double,
PRIMARY KEY ((galaxy, star), planet, moon)
);
當然,光譜型爲真的只適用於star
列,但在非規範化的模型,你會看到它的每一行上。
插入一些數據之後,我的表可能看起來像這樣:
[email protected]: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)
現在,如果我想查詢木星及其衛星:
[email protected]: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
作爲分區鍵。由於卡桑德拉每個分區最多有20億列,而且一個星系絕對可以有數十億個物體在裏面進行軌道運行,所以我認爲需要額外劃分star
。請注意,在此模型中,您必須在每個查詢中指定一個galaxy
和star
。
- 我想你可以擴展分區鍵以包含
planet
,但是那麼你將無法查詢star
的行星。
- 在此模型中,
planet
和moon
是集羣密鑰,因此不需要在每個查詢中指定它們。但是你不能跳過它們,所以你不能指定(在你的WHERE子句中)一個moon
而不指定一個planet
。
- 我的數據建模的感覺並不真正喜歡使用
n/a
作爲自己查詢行星時(沒有月亮)的聚類關鍵。所以也許有更好的方法來建模。也許一堆月亮會更合適?
爲您的數據庫確定正確的數據模型不僅取決於您將在數據庫中擁有的內容,而且非常關注您將如何使用它 - 您的INSERT和SELECT將會如何看起來像,他們會有多少人,他們之間的比例是多少等等。 有一個關於C *數據建模的非常好的在線課程,您可能會感興趣:https://academy.datastax.com/courses/ds220-data-modeling – uri2x