web-dev-qa-db-fra.com

La clé primaire de Cassandra est unique?

Cela pourrait être un peu nul, mais en cassandra la clé principale est-elle unique? Par exemple dans le tableau suivant:

CREATE TABLE users (
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(name, surname)
);

Donc, est-il possible dans ma base de données d’avoir 2 personnes dans le même nom avec le même nom de famille mais d’âge différent? Ce qui signifie même clé primaire ..

23
DarKAngeL

Oui, la clé primaire doit être unique. Sinon, il n'y aurait aucun moyen de savoir quelle ligne renvoyer lorsque vous interrogez avec une clé en double.

Dans votre cas, vous pouvez avoir 2 lignes avec le même nom ou avec le même nom de famille mais pas les deux.

10
Daniel Velkov

Par définition, la clé primaire doit être unique. Mais cela ne signifie pas que vous ne pouvez pas atteindre vos objectifs. Vous avez juste besoin de changer votre approche/terminologie.

Tout d'abord, si vous relâchez l'objectif consistant à faire en sorte que le nom + le nom de famille soit une clé primaire, vous pouvez procéder comme suit:

CREATE TABLE users ( name text, surname text, age int, address text, PRIMARY KEY((name, surname),age) );
insert into users (name,surname,age,address) values ('name1','surname1',10,'address1');
insert into users (name,surname,age,address) values ('name1','surname1',30,'address2');
select * from users where name='name1' and surname='surname1';

 name  | surname  | age | address
-------+----------+-----+----------
 name1 | surname1 |  10 | address1
 name1 | surname1 |  30 | address2

Si, par contre, vous voulez vous assurer que l'adresse est également partagée, vous voulez probablement simplement stocker une collection d'âges dans le dossier de l'utilisateur. Cela pourrait être réalisé en:

CREATE TABLE users2 ( name text, surname text, age set<int>, address text, PRIMARY KEY(name, surname) );
insert into users2 (name,surname,age,address) values ('name1','surname1',{10,30},'address2');
select * from users2 where name='name1' and surname='surname1';

 name  | surname  | address  | age
-------+----------+----------+----------
 name1 | surname1 | address2 | {10, 30}

Cela revient donc à ce que vous devez réellement accomplir. Espérons que les exemples ci-dessus vous donnent quelques idées.

10
Tupshin Harper

La clé primaire est unique. Avec votre modèle de données, vous ne pouvez avoir qu'un seul âge par combinaison (nom, prénom).

4
Richard

Oui, comme mentionné dans les commentaires ci-dessus, vous pouvez avoir une clé composite avec nom, prénom et âge pour atteindre votre objectif, mais cela ne résoudra pas le problème. Au lieu de cela, vous pouvez envisager d'ajouter un nouvel ID utilisateur de colonne et en faire la clé primaire. Ainsi, même en cas de duplication du nom, du prénom et de l'âge, vous n'avez pas à revoir votre modèle de données. 

CREATE TABLE users (
  userId int,
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(userid)
);
0
Prabu Velusamy

Je tiens à préciser que la clé de partition doit être unique. Je ne pouvais pas la récupérer à un endroit, mais à partir des déclarations suivantes.

  • Cassandra a besoin de toutes les colonnes de clé de partition pour pouvoir calculer Le hachage qui lui permettra de localiser les nœuds contenant la partition .

  • La clé de partition a une utilisation particulière dans Apache Cassandra au-delà de , Montrant le caractère unique de l'enregistrement dans la base de données.

  • Veuillez noter qu’il n’y aura pas d’erreur si vous insérez la même clé de partition Encore et encore car il n’ya pas de vérification de contrainte.

  • Les requêtes sur lesquelles vous allez exécuter des recherches d’égalité doivent se trouver dans une clé de partition .

Références

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

comment Cassandra choisit le nœud coordinateur et les nœuds de réplication?

La requête d'insertion remplace les lignes ayant le même champ de données dans la colonne de classification Cassandra

0
Alex Punnen