2015-09-05 98 views
1

我無法獲得Cassandra的數據建模方式,主要是因爲這是我第一次使用非關係數據庫。我現在不確定如何製作模型。基本上我的模型由星系,星星,星雲,行星和月亮組成。一個星系可以擁有所有這些,所以它會是一個N:M的關係。根據我的理解,這個想法將是製作一個包含所有這些組件的表格,或者至少這是我理解Cassandra的數據建模策略和反規範化的想法。使用Cassandra進行數據建模

雖然對我來說似乎並不合適,但我不確定如何去做。

+0

爲您的數據庫確定正確的數據模型不僅取決於您將在數據庫中擁有的內容,而且非常關注您將如何使用它 - 您的INSERT和SELECT將會如何看起來像,他們會有多少人,他們之間的比例是多少等等。 有一個關於C *數據建模的非常好的在線課程,您可能會感興趣:https://academy.datastax.com/courses/ds220-data-modeling – uri2x

回答

1

查看此問題的一種方法是使用您試圖建模的實體的關係。例如,星系有星星,星星有行星,行星有月亮;它們都有一定的特徵(軌道週期以天爲單位,半徑以公里爲單位)。你可以模型與此類似:

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) 

注:

  • 我指定galaxystar作爲分區鍵。由於卡桑德拉每個分區最多有20億列,而且一個星系絕對可以有數十億個物體在裏面進行軌道運行,所以我認爲需要額外劃分star。請注意,在此模型中,您必須在每個查詢中指定一個galaxystar
  • 我想你可以擴展分區鍵以包含planet,但是那麼你將無法查詢star的行星。
  • 在此模型中,planetmoon是集羣密鑰,因此不需要在每個查詢中指定它們。但是你不能跳過它們,所以你不能指定(在你的WHERE子句中)一個moon而不指定一個planet
  • 我的數據建模的感覺並不真正喜歡使用n/a作爲自己查詢行星時(沒有月亮)的聚類關鍵。所以也許有更好的方法來建模。也許一堆月亮會更合適?