2013-05-16 104 views
0

我的問題的說法是: -卡桑德拉架構設計優化

I have a college , every college have some students , 
every student has some data(for eg student id , student name , class etc) related to him. 

我想回答的一種問題是: -

a) get all students of a particular college.(student id and name only not the other data) 
b) get data of a student of a college given his ID and college name . 
c) create a student to a college.(ADD a new student in college). 
d) delete a student of a particular college given his id and college name . 
e) UPdate a students data of a particular college given his ID and college name . 

我曾想過以下架構: -

一列使用row_key作爲學院$ student_id(大學和學生id的連接)和值作爲JSON中學生的數據的家庭。 另一列家庭擁有大學作爲row_key與studentid和學生姓名列表(學生姓名是第一CF學生數據的一部分)串接逗號分隔的字符串。(具體爲第一查詢)

我可以一列用它回答所有查詢。

第二我可以想到: - 作爲row_key和列名稱爲student_id和值爲學生數據(其中也包含學生姓名)的列院系列。 與此CF本身我可以回答所有疑問。

但是,查詢將如何在效率方面表現爲所有學生獲得特定大學的學習機會。

我讀過它會將整行記入內存中,即使當我只需要學生ID和學生姓名時,我也會在第一種方法中保留第二列家族。 甚至當我想爲一個特定的ID和學院的學生將採取整行內存給我,對我有第一種方法

其次在這種方法中,第一個CF,熱點的問題可以那裏。

即使當我想要一個學生爲一個特定的身份證和大學時,它會把內存中的整個行給我,爲此我有第一個方法中的第一個CF。

我唯一想到第二種方法的原因是以下新的查詢必須從集羣中的多個節點進行多次獲取。

從一個特定的大學給所有學生給出的學生ID列表。

在我的第一種方法中,由於大學數據將分佈在不同的節點上,我將不得不從多個節點中獲取數據。而在第二種方法中,大學是我從一個節點本身獲得的關鍵。

BUt第二種方法有許多我上面討論的其他缺點。

什麼可以是更好的方法,或者是第一種方法是正確和有效的?

回答

0

你可以有一個模式像這樣

CREATE COLUMNFAMILY cf(
    college text, 
    student_id bigint, 
    student_name text, 
    class text, 
    ... 
    ..., 
    PRIMARY KEY(college, student_id) 

); 

獲取特定大學的學生。(學生證和名稱不僅沒有其他數據)

cqlsh:keyspace> SELECT * FROM cf; 


college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    IITK |  102 |   B! |   sam 
    IITK |  103 |   B! |   bugy 
    SMU |  101 |   B* |   abhi 
    SMU |  103 |   B! |  sandy 

得到給他的ID和大學名稱大學的學生的數據。

cqlsh:keyspace> SELECT college,student_id,student_class,student_name FROM cf WHERE college='SMU' AND student_id=101; 

college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    SMU |  101 |   B* |   abhi 

創建一個學生到大學。(在大學裏添加一個新的學生)。

INSERT INTO cf (college, student_id ,student_class,student_name) VALUES ('SMU',104,'B!','mat'); 
cqlsh:keyspace> select * from cf ; 

college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    IITK |  102 |   B! |   sam 
    IITK |  103 |   B! |   bugy 
    SMU |  101 |   B* |   abhi 
    SMU |  103 |   B! |  sandy 
    SMU |  104 |   B! |   mat 

刪除給他的ID和大學名稱某所大學的學生。

cqlsh:keyspace> DELETE FROM cf where college='SMU' AND student_id=104; 
cqlsh:keyspace> select * from cf ; 

college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    IITK |  102 |   B! |   sam 
    IITK |  103 |   B! |   bugy 
    SMU |  101 |   B* |   abhi 
    SMU |  103 |   B! |  sandy 

更新給他的ID和大學名稱某所大學的學生數據。

cqlsh:keyspace> UPDATE cf SET student_class='B!' where college='SMU' AND student_id=101; 
cqlsh:keyspace> select * from cf ; 

college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    IITK |  102 |   B! |   sam 
    IITK |  103 |   B! |   bugy 
    SMU |  101 |   B! |   abhi 
    SMU |  103 |   B! |  sandy 

從學生

cqlsh:keyspace> SELECT * FROM cf WHERE college='SMU' AND student_id IN (101,103); 

college | student_id | student_class | student_name 
---------+------------+---------------+-------------- 
    SMU |  101 |   B! |   abhi 
    SMU |  103 |   B! |  sandy 
+0

主鍵是大學的ID的特定高校給出的列表中獲取所有的學生,憑學生證 我會從不同的節點作爲multigets的問題在另一個查詢的情況下,在後面的問題中提到 – Peter

+0

@Peter您是否正在關注cassandra 1.2文檔以及關於您的multiget查詢的更新部分? – abhi

+0

對不起卡桑德拉的天真水平。 我剛剛讀到分片鍵將成爲主鍵的第一列。這將創建熱點的權利?此外,我想知道即使我將通過ID查詢學生,整個行都會被提取到內存中嗎? – Peter