3 votes

Comprendre le modèle de données de Cassandra

J'ai récemment commencé à apprendre No-SQL et Cassandra à travers este article. L'auteur explique le modèle de données à travers ce diagramme : enter image description here

L'auteur donne également l'exemple de la famille de colonnes ci-dessous :

Book {

 key: 9352130677{ name: “Hadoop The Definitive Guide”, author:” Tom White”, publisher:”Oreilly”, priceInr;650, category: “hadoop”, edition:4},

 key: 8177228137{ name”” Hadoop in Action”, author: “Chuck Lam”, publisher:”manning”, priceInr;590, category: “hadoop”},

 key: 8177228137{ name:” Cassandra: The Definitive Guide”, author: “Eben Hewitt”, publisher:” Oreilly”, priceInr:600, category: “cassandra”},

 }

Mais dans ce tutoriel et dans tous les autres que j'ai parcourus, on finit par créer des tables normales dans Cassandra. Je suis incapable de connecter le modèle Cassandra avec ce que je crée.

Par exemple, j'ai créé une famille de colonnes appelée Employé comme ci-dessous :

create columnfamily Employee(empid int primary key,empName text,age int);

Maintenant, j'ai inséré des données et ma famille de colonnes ressemble à ceci : enter image description here

Pour moi, cela ressemble à une table relationnelle ordinaire et non au modèle de données que l'auteur a expliqué. Comment puis-je créer une famille de colonnes Employé où chaque ligne représente un employé avec différents attributs ? Quelque chose comme :

Employee{
101:{name:Emp1,age:20}
102:{name:Emp2,salary:1000}
102:{manager_name:Emp3,age:45}
}

}

3voto

nevsv Points 1798
  1. Vous devez comprendre que dans la représentation utilisant cql, cela peut ressembler à une table relationnelle ordinaire, mais la structure interne des lignes dans Cassandra est complètement différente. Il enregistre un ensemble différent d'attributs pour chaque employé, et les zéros que vous pouvez voir en interrogeant avec cql sont juste une représentation des cellules vides/non existantes.

  2. Ce que vous essayez de réaliser, c'est un modèle de données non structurées. Cassandra a commencé avec ce modèle, et tout fonctionnait comme décrit dans le tutoriel que vous avez lu, mais il existe une opinion selon laquelle la conception de données non structurées est malsaine pour le développement et crée plus de problèmes qu'elle n'en résout. Ainsi, après un certain temps, Cassandra est passé à la structure de données "structurée" (et de thrift à cql). Cela ne signifie pas que vous devez stocker tous les attributs pour toutes les clés/rangs, cela ne signifie pas que tous les rangs ont le même nombre d'attributs, cela signifie simplement que vous devez déclarer les attributs avant de les utiliser.

  3. Vous pouvez réaliser une sorte de modélisation des données non structurées en utilisant les types de données Map, List, Set, etc., les UDT (User defined types) ou simplement en enregistrant vos données sous forme de chaîne json et en les analysant du côté de l'application.

1voto

Gunwant Points 424

Ce que vous avez compris est correct. Il suffit de le croire. En interne, Cassandra stocke les colonnes exactement comme l'image dans votre question. Maintenant, ce que vous attendez est d'insérer une colonne qui n'est pas définie lors de la création de la table Employee. Pour les colonnes dynamiques, vous pouvez toujours utiliser les types de données Map .

Par exemple

create table Employee(
empid int primary key,
empName text,
age int,
attributes Map<text,text>);

Pour ajouter de nouveaux attributs, vous pouvez utiliser les requêtes suivantes.

UPDATE Employee SET attributes =  { manager_name : Emp3, age:45 } WHERE empid = 102;

Mise à jour -

Une autre façon de créer un modèle de colonne dynamique est la suivante

        create table Employee(
    empid int primary key,
    empName text,
    attribute text,
    attributevalue text,
    primary key (empid,empName,attribute)
    );

Prenons quelques inserts -

insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','age','25') ;
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','manager','emp2') ;
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','department','hr') ;

cette structure de données créera une ligne large, et se comporte comme une colonne dynamique. vous pouvez voir que la clé primaire empid et name est commune pour les trois lignes, seuls l'attribut et la valeur changeront.

J'espère que cela vous aidera

-2voto

itstata Points 243

Cassandra utilise une clé primaire spéciale appelée clé de composition. Il s'agit de la représentation des partitions. C'est aussi l'une des raisons pour lesquelles Cassandra est bien dimensionné. La clé composite est utilisée pour déterminer les noeuds sur lesquels les rangées sont stockées.

Le résultat dans votre console peut être un ensemble de lignes, mais l'organisation interne de Cassandra est différente de cela. Avez-vous déjà essayé d'interroger une table sans clé primaire ? Vous verrez rapidement que vous ne pouvez pas interroger cette table flexible (à cause du partitionnement).

Après cela, vous comprendrez pourquoi nous devons utiliser une approche de conception de type "query-first" pour Cassandra. C'est complètement différent de RDBBS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X