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 .

我想到了以下架构:-

一列 Family 使用 row_key 作为 College$student_id(大学和学生 ID 的连接)和 value 作为 JSON 中学生的数据。另一列 Family 具有大学作为 row_key 和一列包含 studentid 和学生姓名列表(学生姓名是第一个 CF 中学生数据的一部分)连接为逗号分隔的字符串。(特别是对于第一个查询)

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

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

但是,查询在获取特定大学的所有学生的效率方面将如何表现。

我已经读过,即使我只需要我在第一种方法中保留第二列族的学生 ID 和学生姓名,它也会将整行记录在内存中。即使我想要一个特定身份和大学的学生,它也会占用整个内存行来给我在第一种方法中我拥有第一个 CF 的东西

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

即使我想要一个特定身份和大学的学生,它也会占用整个内存行来给我在第一种方法中我拥有第一个 CF 的东西。

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

获取给定学生 ID 列表的特定大学的所有学生。

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

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

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

4

1 回答 1

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

获取大学学生的数据,给出他的 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
于 2013-05-16T20:00:12.070 回答