Оптимизация схемы 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