web-dev-qa-db-de.com

Primärschlüssel in Kassandra ist einzigartig?

Es könnte ein bisschen lahm sein, aber in Kassandra ist der Primärschlüssel eindeutig? Zum Beispiel in der folgenden Tabelle:

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

Also, ob es in meiner Datenbank möglich ist, 2 Personen mit demselben Vor- und Nachnamen, aber unterschiedlichem Alter in meiner Datenbank zu haben? Was bedeutet, der gleiche Primärschlüssel ..

23
DarKAngeL

Ja, der Primärschlüssel muss eindeutig sein. Andernfalls gibt es keine Möglichkeit zu wissen, welche Zeile zurückgegeben werden soll, wenn Sie mit einem doppelten Schlüssel abfragen.

In Ihrem Fall können Sie 2 Zeilen mit demselben Namen oder mit demselben Namen haben, jedoch nicht beides.

10
Daniel Velkov

Definitionsgemäß muss der Primärschlüssel eindeutig sein. Das bedeutet jedoch nicht, dass Sie Ihre Ziele nicht erreichen können. Sie müssen lediglich Ihren Ansatz/Ihre Terminologie ändern.

Wenn Sie Ihr Ziel, dass der Name + Nachname ein Primärschlüssel ist, entspannen, können Sie Folgendes tun:

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

Wenn Sie andererseits sicherstellen möchten, dass die Adresse ebenfalls freigegeben wird, möchten Sie wahrscheinlich nur eine Alterssammlung im Benutzerdatensatz speichern. Das könnte erreicht werden durch:

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}

So kommt es zu dem, was Sie tatsächlich erreichen müssen. Hoffentlich geben Ihnen die obigen Beispiele einige Ideen.

10
Tupshin Harper

Der Primärschlüssel ist eindeutig. Mit Ihrem Datenmodell können Sie nur ein Alter pro Kombination (Name, Nachname) haben.

4
Richard

Ja, wie in den obigen Kommentaren erwähnt, können Sie einen zusammengesetzten Schlüssel mit Name, Nachname und Alter haben, um Ihr Ziel zu erreichen, aber das löst das Problem nicht. Sie können stattdessen eine neue Spaltenbenutzer-ID hinzufügen und diese als Primärschlüssel festlegen. Daher müssen Sie Ihr Datenmodell nicht erneut prüfen, wenn Name, Nachname und Alter doppelt vorhanden sind. 

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

Ich würde ausdrücklich sagen, dass der Partitionsschlüssel eindeutig sein sollte. Ich konnte ihn jedoch nicht an einer Stelle erhalten, sondern aus den folgenden Anweisungen.

  • Cassandra benötigt alle Partitionsschlüsselspalten, um den Hash Berechnen zu können, mit dem die Knoten gesucht werden können, die die Partition Enthalten.

  • Der Partitionsschlüssel hat eine besondere Verwendung in Apache Cassandra über Hinaus und zeigt die Eindeutigkeit des Datensatzes in der Datenbank an.

  • Bitte beachten Sie, dass es keinen Fehler gibt, wenn Sie denselben Partitionierungsschlüssel Immer wieder einfügen, da keine Einschränkungsprüfung erfolgt.

  • Abfragen, für die Sie Gleichheitssuchen ausführen, sollten sich in einer Partitionstaste Befinden.

Verweise

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

Wie wählt Cassandra den Koordinatorknoten und die Replikationsknoten aus?

Einfügeabfrage ersetzt Zeilen mit demselben Datenfeld in der Cassandra-Clusterspalte

0
Alex Punnen