Оптимизация схемы Cassandra

Моя постановка проблемы:-

   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(объединение идентификатора колледжа и студента) и значение в качестве данных студента в JSON. Другой столбец Family, в котором в качестве row_key указан колледж, и один столбец со списком имен учеников и учеников (имя ученика является частью данных ученика в первом CF), соединенных в виде строк, разделенных запятыми (специально для первого запроса).

Я могу ответить на все вопросы с ним.

Во-вторых, я могу думать о:- Семействе столбцов с колледжем как row_key и именем столбца как student_id и значением как данные студента (который также содержит имя студента). с помощью этого CF я могу ответить на все вопросы.

Но как запрос будет вести себя с точки зрения эффективности, чтобы получить всех студентов для конкретного колледжа.

Я прочитал, что вся строка запомнится, даже когда мне нужен только идентификатор студента и имя студента, для которого я сохранил семейство второго столбца в моем первом подходе. Даже когда мне нужен студент для определенного идентификатора и колледжа, мне понадобится целый ряд памяти, чтобы дать мне то, для чего у меня есть первый CF в первом подходе.

Во-вторых, при таком подходе проблема горячих точек может быть там.

Даже когда мне нужен студент для определенного студента и колледжа, мне понадобится целый ряд памяти, чтобы дать мне то, для чего у меня есть первый CF в первом подходе.

Единственная причина, по которой я думал о втором подходе, заключалась в следующем запросе, который должен будет выполнять множественное получение из нескольких узлов в кластере.

Получить все студенты из конкретного колледжа, учитывая список идентификаторов студентов.

В моем первом подходе, поскольку данные колледжа будут распределены по узлам, мне придется получать данные от многих узлов. тогда как во втором подходе, поскольку колледж является ключом, я получу его от одного узла.

Но у второго подхода было много других недостатков, которые я обсуждал выше.

Что может быть лучшим подходом или первый подход правильный и эффективный?

1 ответ

Вы можете иметь такую ​​схему

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

получить данные студента колледжа с указанием его удостоверения личности и названия колледжа.

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

Получить все студенты из конкретного колледжа, учитывая список идентификаторов студентов

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
Другие вопросы по тегам