Ich habe Artikel im Netz gelesen, um die Unterschiede zwischen den folgenden "Schlüssel"-Typen zu verstehen. Aber es scheint mir einfach schwer zu fallen, sie zu verstehen. Beispiele werden auf jeden Fall helfen, das Verständnis zu verbessern.
primary key,
partition key,
composite key
clustering key
Es gibt eine Menge Verwirrung in diesem Bereich, ich werde versuchen, es so einfach wie möglich zu machen.
Der Primärschlüssel ist ein allgemeines Konzept zur Bezeichnung einer oder mehrerer Spalten, die zum Abrufen von Daten aus einer Tabelle verwendet werden.
Der Primärschlüssel kann SIMPLE sein und sogar inline deklariert werden:
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
Das bedeutet, dass er aus einer einzigen Spalte besteht.
Der Primärschlüssel kann aber auch COMPOSITE (auch COMPOUND genannt) sein und aus mehreren Spalten gebildet werden.
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
Bei einem COMPOSITE-Primärschlüssel wird der "erste Teil" des Schlüssels PARTITION KEY genannt (in diesem Beispiel ist key_part_one der Partitionsschlüssel) und der zweite Teil des Schlüssels ist der CLUSTERING KEY (in diesem Beispiel key_part_two)
Bitte beachten Sie, dass sowohl der Partitions- als auch der Clustering-Schlüssel aus mehreren Spalten bestehen können, und zwar wie folgt:
create table stackoverflow_multiple (
k_part_one text,
k_part_two int,
k_clust_one text,
k_clust_two int,
k_clust_three uuid,
data text,
PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)
);
Hinter diesen Namen ...
Weitere Informationen zur Verwendung: DATASTAX DOCUMENTATION
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
tabelleninhalt
key | data
----+------
han | solo
COMPOSITE/COMPOUND KEY kann "breite Zeilen" abrufen (d.h. Sie können nur nach dem Partitionsschlüssel abfragen, auch wenn Sie Clustering-Schlüssel definiert haben)
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
Tabelleninhalt
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
Aber Sie können mit allen Schlüsseln (sowohl Partition als auch Clustering) abfragen ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
Abfrageausgabe
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
Wichtiger Hinweis: Der Partitionsschlüssel ist die Mindestangabe, die erforderlich ist, um eine Abfrage mit einer "Where-Klausel" durchzuführen. Wenn Sie einen zusammengesetzten Partitionsschlüssel haben, wie den folgenden
z.B.: PRIMARY KEY((col1, col2), col10, col4))
Sie können die Abfrage nur durchführen, wenn Sie mindestens die beiden Spalten col1 und col2 angeben, die den Partitionsschlüssel definieren. Die allgemeine Regel für die Abfrage ist, dass Sie mindestens alle Spalten des Partitionsschlüssels übergeben müssen, dann können Sie optional jeden Clustering-Schlüssel in der Reihenfolge hinzufügen, in der sie festgelegt sind.
Die gültigen Abfragen sind also (mit Ausnahme der sekundären Indizes)
Ungültig:
Ich hoffe, das hilft.
Hinzufügen einer zusammenfassenden Antwort, da die akzeptierte Antwort ziemlich lang ist. Die Begriffe "Zeile" und "Spalte" werden im Kontext von CQL verwendet, nicht wie Cassandra tatsächlich implementiert ist.
Beispiele:
: Der Partitionsschlüssel ist
a`.: Der Partitionsschlüssel ist
a, der Clustering-Schlüssel ist
b`.: Der zusammengesetzte Partitionsschlüssel ist
(a, b)`.: Der Partitionsschlüssel ist
a, der zusammengesetzte Clustering-Schlüssel ist
(b, c)`.: Der zusammengesetzte Partitionsschlüssel ist
(a, b), der Clustering-Schlüssel ist
c`.: Der zusammengesetzte Partitionsschlüssel ist
(a, b), der zusammengesetzte Clustering-Schlüssel ist
(c, d)`.CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
In CQL ist die Reihenfolge, in der die Spalten für den PRIMARY KEY definiert werden, von Bedeutung. Die erste Spalte des Schlüssels wird Partitionsschlüssel genannt und hat die Eigenschaft, dass alle Zeilen, die denselben Partitionsschlüssel haben (sogar tabellenübergreifend), auf demselben physischen Knoten gespeichert werden. Außerdem wird das Einfügen/Aktualisieren/Löschen von Zeilen, die denselben Partitionsschlüssel für eine bestimmte Tabelle haben, atomar und isoliert durchgeführt. Beachten Sie, dass es möglich ist, einen zusammengesetzten Partitionsschlüssel zu haben, d. h. einen Partitionsschlüssel, der aus mehreren Spalten besteht, wobei ein zusätzlicher Satz von Klammern verwendet wird, um zu definieren, welche Spalten den Partitionsschlüssel bilden.
Partitionierung und Clustering Die PRIMARY KEY-Definition besteht aus zwei Teilen: dem Partitionsschlüssel und den Clustering-Spalten. Der erste Teil entspricht dem Zeilenschlüssel der Speichermaschine, während der zweite Teil zur Gruppierung der Spalten in einer Zeile verwendet wird.
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
Hier ist device_id der Partitionsschlüssel und checked_at der Cluster_key.
Wir können mehrere Cluster-Schlüssel sowie Partitionsschlüssel haben, die von der Deklaration abhängen.