2013-05-16 3 views
0

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

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

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

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

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

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

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

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

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

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

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

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

ответ

0

Вы можете иметь схему, как это

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 

получить данные студента колледжа, учитывая его 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 

создать студент колледжа. (ADD нового студента в колледже).

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 

Обновление данных студентов определенного колледжа данные его 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 

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

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 
+0

Первичный ключ колледжа, студенческий я получаю проблему multigets из разных узлов, как упомянутый позже в вопросе в случае другого запроса – Peter

+0

@Peter Вы следуете за документами cassandra 1.2, а также смотрите раздел обновления, касающийся вашего запроса с несколькими ответами? – abhi

+0

Извините за мой наивный уровень в кассандре. Я только что прочитал, что ключ осколка будет первым столбцом первичного ключа. Это создаст «Горячие точки»? Также я хотел знать, даже когда я буду запрашивать студента по id, будет ли вся строка загружена в память? – Peter

Смежные вопросы