我的问题是:-
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作为college$student_id(大学和学生身份的连接),并在JSON中值作为学生的数据。另一列族以大学为row_key,另一列具有学生和学生姓名列表(学生姓名是第一个CF中学生数据的一部分),连接为逗号分隔字符串。(特别是对于第一个查询)
我可以用它回答所有的问题。
第二,我可以想到:-一个列族,其中大学为row_key,列名为student_id,值为学生数据(其中也包含学生姓名)。有了这个CF本身,我可以回答所有的问题。
但是,对于某一特定大学的所有学生来说,该查询在效率方面将如何表现。
,我已经读过,它将把整个行带入内存,即使我只需要学生的id和学生的名字,我已经在我的第一种方法中保留了第二列家族。即使我想要一个特定的id和大学的学生,它也会占用整个行的记忆,因为它给了我第一个CF在第一个接近。
第二,在这种方法中,可能存在热点问题。
即使我想要一个特殊的id和大学的学生,它也会为给我第一次获得CF的第一次机会而付出全部的记忆。
我想到第二种方法的唯一原因是下面的新查询,它必须从集群中的多个节点执行多个获取。
获取来自某一特定学院的所有学生的ids列表。
在我的第一种方法中,由于大学数据将跨节点传播,我将不得不从多个节点获取数据。而在第二种方法中,由于大学是关键,我将从一个节点本身获得它。
我前面讨论过的BUt第二种方法还有许多其他缺点。
什么是更好的方法,还是第一种方法是正确和有效的?
发布于 2013-05-16 20:00:12
您可以有一个类似于这个的模式
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获取来自某一特定学院的所有学生的ids列表()
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! | sandyhttps://stackoverflow.com/questions/16595243
复制相似问题