2013-05-16 76 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