2014-06-24 1 views
0

Je suis en train de créer des tableaux qui peuvent foreuses jusqu'à plusieurs niveaux pour exempleModélisation de données de données imbriquées à Cassandra?

chaque projet a plusieurs étapes et chaque étapes a mutiple tâches et chaque tâche a quelques tâches secondaires ainsi que des tâches thier propriétés (comme la description, l'auteur, attribué)

Je vais effectuer des opérations CRUD et l'utilisateur naviguera dans le projet.

Cassandra 2.0.7 | CQL spec 3.1.1

Comment puis-je utiliser des touches composites ou toute autre approche avec cela.

Merci à l'avance

Répondre

0

La conception optimale dépend beaucoup de toutes les façons dont vous envisagez d'interroger cet ensemble de données, ainsi que sur le nombre estimé d'articles sur tous les niveaux.

Si tout ce que vous avez besoin est de forage vers le bas, puis la conception suivante pourrait travailler:

CREATE TABLE SubTask 
(
    ProjectId int, 
    <Project fields>, 
    MilestoneId int, 
    <Milestone fields>, 
    TaskId int, 
    <Task fields>, 
    SubTaskId int, 
    <SubTask fields>, 
    PRIMARY KEY (ProjectId, MilestoneId, TaskId, SubTaskId) 
); 

Votre identifiant du projet serait la clé de partitionnement, de sorte que vous devrez vérifier si vous avez suffisamment de projets pour un cloisonnement même parmi vos nœuds de cluster. Vous pouvez également utiliser les touches de partition composées (PRIMARY KEY ((ProjectId, MilestoneId), TaskId, SubTaskId), mais cela limiterait vos possibilités de récupérer uniquement les projets.

Vous pourriez aller avec la convention que les vrais identifiants sont> 0, et préserver les lignes avec l'id 0 ​​pour les champs de description. En d'autres termes, vous remplissez les champs de jalon pour un produit spécifique uniquement sur la ligne ayant TaskId = 0, évitant ainsi la duplication de données.

Vous pouvez interroger toutes les tâches et sous-tâches pour une étape comme suit:

SELECT <task fields>, <subtask fields> 
FROM SubTask 
WHERE ProjectId=xxx AND MilestoneId=yyy; 

Si vous ne avez besoin des champs de travail, vous auriez besoin d'un index sur le champ SubTaskId:

CREATE INDEX ON SubTask(SubTaskId); 

puis sélectionnez comme suit:

SELECT <task fields> 
FROM SubTask 
WHERE ProjectId=xxx AND MilestoneId=yyy AND SubTaskId=0; 

Une solution alternative serait de créer un arate table pour chaque entité (Project, Milestone, Task, SubTask), mais vous aurez besoin de deux requêtes pour récupérer les tâches et sous-tâches).

De même, si le nombre de sous-tâches d'une tâche ne peut pas être trop élevé, vous pouvez tester le user defined types de Cassandra 2.1 (actuellement en version bêta).

+0

merci !! ce qui serait une meilleure performance sage ... table séparée pour chaque entité ou une table très large comme vous avez suggéré ??? – prankyrules

+0

Il n'y a pas de réponse générique à cette question. La bonne approche de la modélisation des données de Cassandra est de commencer par énumérer les requêtes ** ALL ** dont vous aurez besoin, de concevoir vos tables de sorte que ces requêtes puissent être exécutées efficacement. Certaines duplications de données et dénormalisation sont très bien avec Cassandra. – medvekoma

Questions connexes