2013-05-16 3 views
0

Mon énoncé du problème est le suivant: -optimisation de conception de schéma 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. 

Le genre de questions que je voudrais répondre sont: -

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 . 

J'ai pensé schéma suivant: -

Une colonne Famille qui utilise row_key comme college $ student_id (concaténation de l'id de collège et de l'étudiant) et valeur comme données de l'étudiant dans JSON. Une autre colonne avec un collège comme row_key et une colonne avec la liste des étudiants et des étudiants (le nom de l'étudiant fait partie des données de l'étudiant dans la première CF) concaténés comme des chaînes séparées par des virgules. répondre à toutes les requêtes avec.

Deuxièmement, je peux penser à: - Une famille de colonnes avec college comme row_key et le nom de la colonne comme ID_étudiant et la valeur comme données de l'élève (qui contient aussi le nom de l'étudiant). avec ce CF lui-même je peux répondre à toutes les questions.

Mais comment la requête se comportera-t-elle en termes d'efficacité pour obtenir tous les étudiants pour un collège particulier. J'ai lu que cela prendrait toute la ligne en mémoire même quand je n'ai besoin que d'id étudiant et de nom d'étudiant pour lequel j'ai gardé la deuxième famille de colonnes dans ma première approche. Même quand je veux un étudiant pour un identifiant particulier et le collège, il prendra toute la ligne en mémoire pour me donner ce dont j'ai le premier CF dans la première approche

En second lieu dans cette approche, problème des points chauds peut être Là.

Même quand je veux un étudiant pour un id particulier et un collège, il prendra toute la rangée en mémoire pour me donner ce que j'ai le premier CF en première approche. La seule raison pour laquelle je pensais à la deuxième approche était pour la nouvelle requête suivante qui devra faire des multi-gets à partir de plusieurs nœuds dans le cluster.

Obtenez tous les étudiants d'un collège donné liste des ID des étudiants. Dans ma première approche comme les données du collège seront réparties sur les nœuds, je vais devoir faire un get à partir de nombreux nœuds. alors qu'en deuxième approche, le collège est la clé, je l'obtiens d'un nœud lui-même.

La seconde approche BUt présentait de nombreux autres inconvénients mentionnés ci-dessus.

Quelle peut être une meilleure approche ou la première approche est-elle juste et efficace?

Répondre

0

Vous pouvez avoir un schéma comme celui-ci

CREATE COLUMNFAMILY cf(
    college text, 
    student_id bigint, 
    student_name text, 
    class text, 
    ... 
    ..., 
    PRIMARY KEY(college, student_id) 

); 

obtenir tous les élèves d'un collège en particulier.(Id étudiant et le nom seulement et non les autres données)

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 

obtenir des données d'un étudiant d'un collège donné son ID et le nom de l'université.

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 

créer un étudiant dans un collège. (Ajouter un nouvel étudiant à l'université).

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 

supprimer un étudiant d'un collège en particulier compte tenu de son identifiant et le nom du collège.

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 

mise à jour des données a des étudiants d'un collège en particulier compte tenu de son ID et le nom de l'université.

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 

Obtenez tous les élèves d'une liste de collège en particulier compte tenu des ids des étudiants

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

La clé primaire est un collège, id étudiant Je vais avoir un problème de multigets de différents nœuds comme mentionné plus tard dans la question dans le cas d'une autre requête – Peter

+0

@Peter Suivez-vous docs cassandra 1.2 et également voir la section de mise à jour concernant votre requête multiget? – abhi

+0

Désolé pour mon niveau naïf en cassandra. Je viens de lire que la clé shard sera la première colonne de la clé primaire. Cela va créer des Hotspots à droite? Aussi, je voulais savoir même quand je vais interroger un étudiant par ID, sera la ligne entière sera récupérée en mémoire? – Peter

Questions connexes