数据库cassandra模式设计优化

gzszwxb4  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(374)

我的问题陈述是:-

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\u key作为college$student\u id(college和student id的串联)和值作为json中学生的数据。另一个列族,其中college作为行\键,一列包含studentid和student name列表(student name是第一个cf中的学生数据的一部分),以逗号分隔的字符串连接在一起。(特别是对于第一个查询)
我可以用它回答所有的问题。
第二,我可以想到:-列族,其中college作为行键,column name作为student id,value作为student数据(也包含student name)。有了这个cf,我可以回答所有的问题。
但是,对于让所有学生都进入某一所大学,这个查询在效率方面会有怎样的表现呢。
我已经读过了,即使我只需要学生id和学生姓名,我在第一种方法中保留了第二列族,它也会把整行都记下来。即使我想要一个学生有一个特定的身份证和大学,它也会在记忆中占据整行,因为它给了我在第一种方法中第一个cf的东西
其次,在这种方法中,热点问题可能存在。
即使我想要一个学生有一个特定的身份证和大学,它也会在记忆中占据整行,因为它给了我在第一种方法中第一个cf的东西。
我考虑第二种方法的唯一原因是下面的新查询必须从集群中的多个节点执行multi-get。
让特定学院的所有学生给出学生的ID列表。
在我的第一种方法中,由于大学数据将分布在多个节点上,因此我必须从多个节点获取数据。而在第二种方法中,大学是关键,我将从一个节点本身获得它。
但第二种方法还有许多其他缺点,我在上面讨论过。
什么是更好的方法?或者第一种方法正确有效吗?

sigwle7e

sigwle7e1#

你可以有这样的模式

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

根据学生的身份证和学校名称更新学生的数据。

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

相关问题