2016-02-08 181 views
1

我只是切換到卡桑德拉和我有這樣的項目模型:卡桑德拉數據庫模型

1.House - Here is its view 其中有2 city,3 zip和4 property type

我還需要all cities view我需要所有屬性類型和拉鍊搜索表單完成(尚未實施)。

據我所知,我應該創建4個表並使主鍵......「外鍵」,不是嗎?

我也有小的要求 - 像哈里杜魯門「給我一個單手經濟學家,」要求一個沮喪的美國總統。 「我所有的經濟學家都說'一方面......另一方面'」:-)。

我沒有足夠的經驗與卡桑德拉作出選擇,如果我得到「或者你可以這樣或那樣做」,所以給我一個最好的模式,我會實現它。

謝謝

回答

0

據我所知,我應該創建4個表,使主鍵...「外鍵」,應該不是我?

你絕對不想這樣做。首先,Cassandra中不存在外鍵。其次,你談論的是從關係的角度來建模。使用Cassandra時,您不希望一個查詢的數據分佈在多個表中,因爲這可能分佈在多個節點上。查詢多個節點會在網絡中引入更多的網絡時間,這很慢。

在卡桑德拉,你想採取基於查詢的建模方法。有時這可能意味着每個查詢都有一個表。考慮到這一點,我聽到你需要查詢你的屬性兩種不同的方式:(?MLS)

  • 通過「房子」
  • 通過城市

從本質上講,你應該有一個表服務於每這些查詢:

CREATE TABLE housesbymls (
    mls text, 
    city text, 
    price bigint, 
    propertytype text, 
    state text, 
    street text, 
    year bigint, 
    zip text, 
    PRIMARY KEY (mls)); 

CREATE TABLE housesByCity (
    mls text, 
    street text, 
    city text, 
    state text, 
    zip text, 
    propertyType text, 
    price bigint, 
    year bigint, 
    PRIMARY KEY ((state,city),zip,mls)); 

upserting一些數據後,我可以通過MLS查詢:

[email protected]:stackoverflow> SELECT * FROM housesByMLS WHERE mls='09110857'; 

mls  | city  | price | propertytype  | state | street       | year | zip 
----------+----------+--------+------------------+-------+--------------------------------+------+------- 
09110857 | Palatine | 104900 | Condominium Unit | IL | 1025 North Serling Avenue, 211 | 1978 | 60067 

(1 rows) 

,我還可以通過國家/城市或州/市/郵編查詢:

[email protected]:stackoverflow> SELECT * FROM housesByCity 
    WHERE state='IL' AND city='Palatine'; 

或:

[email protected]:stackoverflow> SELECT * FROM housesByCity 
    WHERE state='IL' AND city='Palatine' AND zip='60067'; 

這兩項回報:

state | city  | zip | mls  | price | propertytype  | street       | year 
-------+----------+-------+----------+--------+------------------+--------------------------------+------ 
    IL | Palatine | 60067 | 09110857 | 104900 | Condominium Unit | 1025 North Serling Avenue, 211 | 1978 

(1 rows) 

背後的想法這個PRIMARY KEY結構是statecity組成的分區鍵(這有助於Cass andra找出將該行放入羣集的位置),因此它們都是必需的。然後,由於城市可能有多個zip代碼,您還可以將查詢集中在該代碼上。Cassandra中的主鍵是獨一無二的,所以我把mls放在最後以確保唯一性。

+0

謝謝SOO,亞倫爲您提供了精彩而全面的答案。這正是我所需要的,我已經走錯了方向。我需要一些時間逐行閱讀你的答案...... – Svitlana

+0

@Svitlana很高興我能幫忙!另一篇關於SO的文章可能對你有所幫助,這是Carlo對Cassandra中不同類型的鍵及其用法的回答:http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key- and-clustering-key-in-cassandra/24953331#24953331 – Aaron

+0

謝謝你,亞倫。在實現之前會嘗試閱讀和理解:-)。客戶總是希望明天就能完成,通常我需要做兩次:-)。謝謝你的時間,亞倫! – Svitlana