繁体   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