658 Stimmen

Unterschied zwischen Partitionsschlüssel, zusammengesetztem Schlüssel und Clustering-Schlüssel in Cassandra?

Ich habe Artikel im Netz gelesen, um die Unterschiede zwischen den folgenden Schlüssel-Typen zu verstehen. Aber es fällt mir schwer, es zu erfassen. Beispiele werden definitiv helfen, um es besser zu verstehen.

Primärschlüssel,
Partitionsschlüssel, 
Zusammengesetzter Schlüssel 
Clustering-Schlüssel

3voto

winwin Punkte 627

Ich hätte gerne ein Wort, da mir keines der Antworten wirklich geholfen hat zu verstehen, was sie tatsächlich bedeuten.

Partitionsschlüssel gruppiert Ihre Daten basierend auf ihrer Einzigartigkeit. Jeder, der denselben Schlüssel hat, kommt in dieselbe Partition.

Clustering-Schlüssel hingegen identifiziert eine Zeile eindeutig innerhalb einer Partition.

Zum Beispiel haben wir eine Tabelle:

CREATE TABLE temperature_readings (
  sensor_id text,
  time timestamp,
  temperature float,
  PRIMARY KEY (sensor_id, time)
)

in der wir Messwerte eines Temperatursensors mit der ID sensor_id zu einem bestimmten time speichern.

sensor_id ist der Partitionsschlüssel und time ist der Clustering-Schlüssel.

Wir können viele Zeilen mit dem gleichen sensor_id laden und sie werden in derselben Partition gespeichert, sortiert nach ihrem time. Für jeden Sensor werden sie "zusammengefasst" sein (und physisch auf demselben Cassandra-Knoten gespeichert).

Ich stelle es mir so vor:

+-----------+------------+--------------
| sensor_id | time       | weitere Reihendaten...
+-----------+------------+--------------
|  1        | 1682615843 |
|           +------------+
|           | 1682615848 |
|           +------------+
|           | 1682615890 |
+-----------+------------+
|  2        | 1682615111 |
|           +------------+
|           | 1682615123 |
+-----------+------------+
| 99909     | 1682615688 |
|           +------------+

 und so weiter...           

(Auch wenn es nicht korrekt ist im Sinne davon, wie tatsächliche Daten physisch auf der Festplatte gespeichert werden.)

2voto

kboom Punkte 2079

Es ist erwähnenswert, dass Sie diese wahrscheinlich viel häufiger verwenden werden als in ähnlichen Konzepten in der relationalen Welt (zusammengesetzte Schlüssel).

Beispiel - nehmen wir an, Sie müssen die letzten N Benutzer finden, die kürzlich der Benutzergruppe X beigetreten sind. Wie würden Sie dies effizient tun, wenn Lesevorgänge in diesem Fall überwiegen? So (aus dem offiziellen Cassandra-Leitfaden):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

Hier ist der Partitionierungsschlüssel selbst zusammengesetzt und der Clustering-Schlüssel ist ein Beitrittsdatum. Der Grund, warum ein Clustering-Schlüssel ein Beitrittsdatum ist, ist, dass die Ergebnisse bereits sortiert sind (und gespeichert, was den Aufruf schnell macht). Aber warum verwenden wir einen zusammengesetzten Schlüssel für den Partitionierungsschlüssel? Weil wir immer so wenige Partitionen wie möglich lesen wollen. Wie hilft es, join_date dort einzufügen? Jetzt werden Benutzer aus derselben Gruppe und demselben Beitrittsdatum in einer einzigen Partition abgelegt! Das bedeutet, dass wir immer so wenige Partitionen wie möglich lesen werden (zuerst mit den neuesten beginnen, dann zu den älteren übergehen usw., anstatt zwischen ihnen hin und her zu springen).

Tatsächlich müssten Sie in extremen Fällen auch den Hash eines join_date anstelle eines join_date alleine verwenden - so dass, wenn Sie oft nach den letzten 3 Tagen suchen, diese den gleichen Hash teilen und daher aus derselben Partition verfügbar sind!

1voto

greperror Punkte 4316

Primärschlüssel: Wie in vielen Datenbanken ist es ein eindeutiger Schlüssel in einer Tabelle, im Wesentlichen bedeutet dies, dass für zwei beliebige Datensätze in einer Tabelle der Primärschlüssel nicht gleich sein kann. Die Datenbank, in diesem Fall Cassandra, ist so konzipiert, dass diese Bedingung in allen Situationen erfüllt ist. Wenn Sie also einen Datensatz mit PK1 als Primärschlüssel schreiben möchten und bereits ein Datensatz mit demselben Schlüssel PK1 vorhanden ist, wird er überschrieben, sonst wird ein neuer Datensatz erstellt.

Partitionsschlüssel: Es handelt sich um eine Struktur verteilter Datenbanken (bei der die Daten einer einzelnen Tabelle in mehrere Teile, sogenannte Partitionen, aufgeteilt werden). Diese Partitionen werden dann mithilfe einer Verteilungsstrategie (in der Regel dem Hash des Partitionsschlüssels) über Knoten verteilt, um unendliche Skalierungsmöglichkeiten zu erhalten. Der Partitionsschlüssel ist eine Gruppe von Spalten eines Datensatzes, die bestimmt, zu welcher Partition dieser Datensatz gehört. Somit bestimmt der Partitionsschlüssel den physischen Speicherort eines Datensatzes über einen verteilten Cluster von Knoten hinweg.

Clustering Key: Der Clustering Key bestimmt die Reihenfolge von Datensätzen in einer bestimmten Partition. Wenn sich also 10.000 Datensätze in einer Partition befinden, bestimmt der Clustering Key die Reihenfolge, in der diese 10.000 Datensätze in geordneter Weise physisch gespeichert werden.

Beispiel:

Angenommen, Sie haben eine Tabelle in Cassandra, um Verkaufsereignisse einer E-Commerce-Website zu speichern.

[order_id, item_id, quantity, amount, payment_id, status, order_time, PRIMARY KEY( (order_id, item_id), order_time)] with clustering ORDER BY (order_time DESC);

Also hier ist,

Der Primärschlüssel ist ((order_id, item_id), order_time) und bestimmt die Eindeutigkeit eines Datensatzes in der Tabelle.

Der Partitionsschlüssel ist (order_id, item_id), der Hash dieses Tupels bestimmt die Partition dieses Datensatzes und seinen Standort im verteilten Cluster.

Der Clustering Key ist order_time, für eine bestimmte Partition werden die Datensätze nach order_time absteigend geordnet. Wenn Sie also eine Limit 1 cql-Abfrage für eine bestimmte Partition durchführen, erhalten Sie immer den Datensatz mit dem maximalen Zeitstempel.

Ein zusammengesetzter Schlüssel ist nur ein Begriff, um zu spezifizieren, dass der Primärschlüssel einer Tabelle nicht aus einer einzelnen Spalte, sondern aus mehreren Spalten besteht.

Der Primärschlüssel ist eine Kombination aus Partition und Clustering Key.

0voto

Ejaz Ahmed Punkte 1

Haftungsausschluss: Diese Antwort bezieht sich spezifisch auf DynamoDB, jedoch gelten die Konzepte auch für Cassandra, da beide NoSQL-Datenbanken sind.

Wenn Sie eine Tabelle erstellen, müssen Sie neben dem Tabellennamen den Primärschlüssel der Tabelle angeben. Der Primärschlüssel identifiziert jedes Element in der Tabelle eindeutig, sodass kein Element den gleichen Schlüssel haben kann.

DynamoDB unterstützt zwei verschiedene Arten von Primärschlüsseln:

Partitionsschlüssel - Ein einfacher Primärschlüssel, bestehend aus einem Attribut, das als Partitionsschlüssel bekannt ist.

DynamoDB verwendet den Wert des Partitionsschlüssels als Eingabe für eine interne Hashfunktion. Der Ausgabewert der Hashfunktion bestimmt die Partition (physikalischer Speicher innerhalb von DynamoDB), in der das Element gespeichert wird.

In einer Tabelle, die nur einen Partitionsschlüssel hat, können keine zwei Elemente den gleichen Partitionsschlüsselwert haben.

Partitionsschlüssel und Sortierschlüssel - Als zusammengesetzter Primärschlüssel bezeichnet, besteht dieser Schlüsseltyp aus zwei Attributen. Das erste Attribut ist der Partitionsschlüssel und das zweite Attribut ist der Sortierschlüssel.

DynamoDB verwendet den Wert des Partitionsschlüssels als Eingabe für eine interne Hashfunktion. Der Ausgabewert der Hashfunktion bestimmt die Partition (physikalischer Speicher innerhalb von DynamoDB), in der das Element gespeichert wird. Alle Elemente mit dem gleichen Partitionsschlüsselwert werden zusammen in sortierter Reihenfolge nach dem Sortierschlüsselwert gespeichert.

In einer Tabelle, die einen Partitionsschlüssel und einen Sortierschlüssel hat, ist es möglich, dass zwei Elemente den gleichen Partitionsschlüsselwert haben. Diese zwei Elemente müssen jedoch unterschiedliche Sortierschlüsselwerte haben.

Ein zusammengesetzter Primärschlüssel bietet zusätzliche Flexibilität beim Abfragen von Daten. Wenn Sie beispielsweise nur den Wert für Künstler angeben, ruft DynamoDB alle Lieder dieses Künstlers ab. Um nur eine Teilmenge von Liedern eines bestimmten Künstlers abzurufen, können Sie einen Wert für Künstler zusammen mit einem Bereich von Werten für Songtitel angeben.

Hinweis: Der Partitionsschlüssel eines Elements ist auch als sein Hash-Attribut bekannt. Der Begriff Hash-Attribut leitet sich von der Verwendung einer internen Hashfunktion in DynamoDB ab, die Datenobjekte gleichmäßig über Partitionen verteilt, basierend auf ihren Partitionsschlüsselwerten.

Der Sortierschlüssel eines Elements ist auch als sein Bereichsattribut bekannt. Der Begriff Bereichsattribut leitet sich von der Art und Weise ab, wie DynamoDB Elemente mit dem gleichen Partitionsschlüssel physisch nahe beieinander und in sortierter Reihenfolge nach dem Sortierschlüsselwert speichert.

Referenz - https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

0voto

Tristate Punkte 1248

Cassandra verwendet einen speziellen Typ von Primärschlüssel namens Verbundschlüssel (oder zusammengesetzter Schlüssel), um Gruppen von verwandten Zeilen, auch Partitionen genannt, darzustellen. Der Verbundschlüssel besteht aus einem Partitionsschlüssel sowie einer optionalen Gruppe von Clustering-Spalten. Der Partitionsschlüssel wird verwendet, um die Knoten zu bestimmen, auf denen die Zeilen gespeichert sind, und kann selbst aus mehreren Spalten bestehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X