Cassandra架构设计优化

时间:2013-05-16 18:53:38

标签: database database-design nosql cassandra cassandra-0.7

我的问题陈述是: -

   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,一列为学生姓名和学生姓名(学生姓名是第一个CF中学生数据的一部分),以逗号分隔的字符串连接。(特别是第一个查询)

我可以用它回答所有问题。

其次我能想到: - 一个列族,其中大学为row_key,列名为student_id,值为学生数据(也包含学生姓名)。 有了这个CF本身,我可以回答所有问题。

但是查询如何在效率方面为所有学生提供特定学院的表现。

我已经读过它会将整行记录到内存中,即使我只需要学生ID和学生名称,我已经在第一个方法中保留了第二列系列。 即使我想要一个特定身份和大学的学生,也会在整个记忆中占据我的第一个方法中的第一个CF

其次在这种方法中,热点问题可能存在。

即使我想要一个特定身份和大学的学生,也会把整个记忆中的一行留给我,让我在第一个方法中获得第一个CF.

我想到第二种方法的唯一原因是针对以下新查询,该查询必须从群集中的多个节点进行多次获取。

根据学生的ID列表,让所有来自特定大学的学生。

在我的第一种方法中,大学数据将分布在各个节点上,我将不得不从许多节点获取。而在第二种方法中,大学是关键,我将从一个节点本身获得它。

BUt第二种方法有许多我上面讨论的其他缺点。

什么是更好的方法,还是第一种方法是正确有效的?

1 个答案:

答案 0 :(得分:0)

您可以拥有这样的架构

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

根据他的身份证和大学名称获取大学学生的数据。

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

根据自己的身份和大学名称删除某个大学的学生。

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