據我所知,我應該創建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結構是state
和city
組成的分區鍵(這有助於Cass andra找出將該行放入羣集的位置),因此它們都是必需的。然後,由於城市可能有多個zip
代碼,您還可以將查詢集中在該代碼上。Cassandra中的主鍵是獨一無二的,所以我把mls
放在最後以確保唯一性。
謝謝SOO,亞倫爲您提供了精彩而全面的答案。這正是我所需要的,我已經走錯了方向。我需要一些時間逐行閱讀你的答案...... – Svitlana
@Svitlana很高興我能幫忙!另一篇關於SO的文章可能對你有所幫助,這是Carlo對Cassandra中不同類型的鍵及其用法的回答:http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key- and-clustering-key-in-cassandra/24953331#24953331 – Aaron
謝謝你,亞倫。在實現之前會嘗試閱讀和理解:-)。客戶總是希望明天就能完成,通常我需要做兩次:-)。謝謝你的時間,亞倫! – Svitlana