簡體   English   中英

Cassandra模式設計優化

[英]Cassandra schema design optimization

我的問題陳述是:

   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 .

我想到了以下方案:

一列Family,它使用row_key作為college $ student_id(學院ID和學生ID的串聯),並將值作為JSON中學生的數據。 另一列Family以row_key為大學,一列包含學生編號和學生姓名列表(學生姓名是第一個CF中學生數據的一部分),以逗號分隔的字符串連接在一起(特別是對於第一個查詢)

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

其次,我可以想到:-一個列族,大學為row_key,列名為student_id,值作為學生數據(也包含學生名)。 有了這個CF本身,我可以回答所有查詢。

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

我讀過它,即使我只需要學生ID和學生姓名,也會將整行記錄到內存中,而我在第一種方法中一直將第二列家庭保留下來。 即使當我想要一個具有特定ID和大學的學生時,它也會占用整個內存行,以便為我提供我在第一種方法中擁有的第一個CF

其次,在這種方法中,熱點問題可能存在。

即使當我想要一個具有特定ID和大學的學生時,它也會占用整個內存行,以便為我提供第一個方法中我擁有的第一個CF。

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

根據給定的學生ID列表,獲取來自特定學院的所有學生。

在我的第一種方法中,由於大學數據將分布在各個節點上,因此我必須從許多節點中獲取數據。 而在第二種方法中,作為大學是關鍵,我將從一個節點本身獲得它。

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

什么是更好的方法,或者第一種方法正確有效?

您可以有一個這樣的架構

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

);

獲取特定學院的所有學生。(學生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

根據給定的學生ID列表,獲取來自特定學院的所有學生

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM