Cassandra Datenmodell mit einfachem Datenbankbeispiel
โก Intelligente Zusammenfassung
Cassandra Die Regeln des Datenmodells kehren die Gewohnheiten des relationalen Designs um: Tabellen werden fรผr Abfragen statt fรผr Entitรคten erstellt. Diese Seite behandelt die Kernregeln, die Auswahl von Partitionsschlรผsseln und Beispielschemata fรผr 1:1-, 1:n- und n:m-Beziehungen.

Obwohl Cassandra Die Abfragesprache รคhnelt SQL Sprache, ihre Datenmodellierungsmethoden sind vรถllig unterschiedlich.
In Cassandra, ein schlechtes Datenmodell kann die Leistung beeintrรคchtigen, insbesondere wenn Benutzer versuchen, die RDBMS-Konzepte auf Cassandra. Beachten Sie am besten einige der unten aufgefรผhrten Regeln.
Cassandra Datenmodellregeln
In Cassandra, schreibt sind nicht teuer. Cassandra unterstรผtzt keine Verknรผpfungen, Gruppierungen nach, OR-Klauseln, Aggregationen usw. Daher mรผssen Sie Ihre Daten so speichern, dass sie vollstรคndig abrufbar sind. Daher mรผssen diese Regeln bei der Modellierung von Daten beachtet werden Cassandra.
Maximieren Sie die Anzahl der Schreibvorgรคnge
In Cassandra, schreibt sind sehr gรผnstig. Cassandra ist auf hohe Schreibleistung optimiert. Maximieren Sie daher Ihre Schreibvorgรคnge, um eine bessere Leseleistung und Datenverfรผgbarkeit zu erzielen. Es besteht ein Zielkonflikt zwischen Datenschreib- und Datenlesevorgรคngen. Optimieren Sie daher Ihre Leseleistung, indem Sie die Anzahl der Schreibvorgรคnge maximieren.
Maximieren Sie die Datenduplizierung
Datendenormalisierung und Datenduplizierung sind de facto der Fall Cassandra. Festplattenspeicher ist nicht teurer als Arbeitsspeicher, CPU-Verarbeitung und IO-Operationen. Cassandra Da es sich um eine verteilte Datenbank handelt, bietet die Datenduplizierung eine sofortige Datenverfรผgbarkeit und keinen Single Point of Failure.
Cassandra Datenmodellierungsziele
Sie sollten folgende Ziele haben, wenn Sie Daten modellieren in Cassandra:
Verteilen Sie die Daten gleichmรครig Cluster
Sie mรถchten auf jedem Knoten von die gleiche Datenmenge Cassandra ClusterDie Daten werden anhand von Partitionsschlรผsseln, die den ersten Teil des Primรคrschlรผssels bilden, auf verschiedene Knoten verteilt. Wรคhlen Sie daher mรถglichst eine Spalte mit hoher Kardinalitรคt als Partitionsschlรผssel, um die Daten gleichmรครig im Cluster zu verteilen.
Minimieren Sie die Anzahl der beim Abfragen von Daten gelesenen Partitionen
Partitionen sind eine Gruppe von Datensรคtzen mit demselben Partitionsschlรผssel. Wenn die Leseabfrage ausgegeben wird, werden Daten von verschiedenen Knoten aus verschiedenen Partitionen gesammelt.
Wenn es viele Partitionen gibt, mรผssen alle diese Partitionen besucht werden, um die Abfragedaten zu sammeln.
Das bedeutet nicht, dass keine Partitionen erstellt werden sollten. Bei sehr groรen Datenmengen ist es nicht mรถglich, diese auf einer einzigen Partition zu speichern. Die Leistung wรผrde dadurch stark beeintrรคchtigt.
Versuchen Sie daher, eine ausgewogene Anzahl an Partitionen zu wรคhlen.
Guter Primรคrschlรผssel Cassandra
Beide oben genannten Ziele hรคngen von einer einzigen Entscheidung ab. Die beiden folgenden Schemata zeigen daher dieselbe Tabelle einmal mit einem ungeeigneten Schlรผssel und einmal mit einem geeigneten Schlรผssel.
Nehmen wir ein Beispiel und finden wir heraus, welcher Primรคrschlรผssel gut ist.
Hier ist die Tabelle MusicPlaylist.
CREATE TABLE MusicPlaylist ( SongId int, SongName text, Year int, Singer text, PRIMARY KEY (SongId, SongName) );
Im obigen Beispiel, Tabelle MusicPlaylist,
- SongId ist der Partitionsschlรผssel, und
- SongName ist die Clustering-Spalte
- Die Daten werden anhand des Songnamens gruppiert. Pro Song-ID wird nur eine Partition erstellt, und da jeder Song eine eindeutige Kennung hat, enthรคlt jede Partition eine einzelne Zeile.
Der Datenabruf ist bei diesem Datenmodell aufgrund des fehlerhaften Primรคrschlรผssels langsam.
Hier ist eine weitere Tabelle MusicPlaylist.
CREATE TABLE MusicPlaylist ( SongId int, SongName text, Year int, Singer text, PRIMARY KEY ((SongId, Year), SongName) );
Im obigen Beispiel, Tabelle MusicPlaylist,
- SongId und Year sind der Partitionsschlรผssel, und
- SongName ist die Clusterspalte.
- Die Daten werden auf der Grundlage des Songnamens gruppiert. In dieser Tabelle wird jedes Jahr eine neue Partition erstellt. Alle Songs des Jahres befinden sich auf demselben Knoten. Dieser Primรคrschlรผssel ist fรผr die Daten sehr nรผtzlich.
Unser Datenabruf wird durch dieses Datenmodell schnell erfolgen.
Modellieren Sie Ihre Daten in Cassandra
Beim Modellieren Ihrer Abfragen sollten Sie Folgendes beachten:
Bestimmen Sie, welche Abfragen Sie unterstรผtzen mรถchten
Bestimmen Sie zunรคchst, welche Abfragen Sie wรผnschen.
Brauchen Sie zum Beispiel?
- Joins
- Gruppiere nach
- Filtern nach welcher Spalte usw.
Erstellen Sie eine Tabelle entsprechend Ihren Abfragen
Erstellen Sie eine Tabelle entsprechend Ihren Abfragen. Erstellen Sie eine Tabelle, die Ihren Anforderungen entspricht. Versuchen Sie, eine Tabelle so zu erstellen, dass eine Mindestanzahl an Partitionen gelesen werden muss.
In den drei folgenden Abschnitten wird dieses Prinzip auf die drei Beziehungstypen angewendet, die in nahezu jedem Schema vorkommen.
Umgang mit Eins-zu-Eins-Beziehungen in Cassandra
Eine Eins-zu-eins-Beziehung bedeutet, dass zwei Tabellen eine Eins-zu-eins-Entsprechung haben. Beispielsweise kann der Student nur einen Kurs anmelden, und ich mรถchte bei einem Studenten suchen, in welchem โโKurs ein bestimmter Student eingeschrieben ist.
In diesem Fall sollte Ihr Tabellenschema alle Details des Studenten enthalten, die dem jeweiligen Kurs entsprechen, wie etwa den Namen des Kurses, die Matrikelnummer des Studenten, den Namen des Studenten usw.

Das obige Diagramm zeigt eine einzelne Tabelle, die die Abfrage bedient, da ein Student genau einem Kurs zugeordnet ist.
CREATE TABLE Student_Course ( Student_rollno int PRIMARY KEY, Student_name text, Course_name text );
Da Student_rollno der Partitionsschlรผssel ist, liest eine Suche anhand der Matrikelnummer genau eine Partition.
Umgang mit Eins-zu-Viele-Beziehungen in Cassandra
Eins-zu-viele-Beziehungen bedeuten, dass zwischen zwei Tabellen eine Eins-zu-viele-Korrespondenz vorliegt.
Beispielsweise kann ein Studiengang von vielen Studierenden studiert werden. Ich mรถchte alle Studenten durchsuchen, die einen bestimmten Kurs studieren.
Wenn ich also nach dem Kursnamen frage, erhalte ich viele Studentennamen, die einen bestimmten Kurs belegen werden.

Hierbei dient der Kursname als Partitionsschlรผssel, sodass jeder Student eines Kurses in der gleichen Partition landet, und die Matrikelnummer dient als Clusterspalte, sodass jeder Student eine eigene Zeile bildet.
CREATE TABLE Student_Course ( Course_name text, Student_rollno int, Student_name text, PRIMARY KEY (Course_name, Student_rollno) );
Mit der folgenden Abfrage kann ich alle Studierenden fรผr einen bestimmten Kurs abrufen.
SELECT * FROM Student_Course WHERE Course_name = 'Course Name';
Umgang mit Many-to-Many-Beziehungen in Cassandra
Viele-zu-viele-Beziehungen bedeuten, dass es viele-zu-viele-Korrespondenzen zwischen zwei Tabellen gibt.
Beispielsweise kann ein Studiengang von vielen Studierenden studiert werden und ein Student kann auch viele Studiengรคnge studieren.

Ich mรถchte alle Studenten durchsuchen, die einen bestimmten Kurs studieren. Auรerdem mรถchte ich alle Kurse durchsuchen, die ein bestimmter Student studiert.
In diesem Fall verwende ich also zwei Tabellen, d. h. ich teile das Problem in zwei Fรคlle auf. Dies veranschaulicht die Duplizierungsregel am besten: Dieselben Fakten werden zweimal geschrieben, sodass jede Abfrage eine Partition liest.
Zunรคchst erstelle ich eine Tabelle, in der Sie Kurse eines bestimmten Studenten finden kรถnnen.
CREATE TABLE Student_Course ( Student_rollno int, Course_name text, Student_name text, PRIMARY KEY (Student_rollno, Course_name) );
Mit der folgenden Abfrage kann ich alle Kurse eines bestimmten Studenten finden.
SELECT * FROM Student_Course WHERE Student_rollno = 101;
Zweitens werde ich eine Tabelle erstellen, anhand derer Sie sehen kรถnnen, wie viele Studierende einen bestimmten Kurs studieren.
CREATE TABLE Course_Student ( Course_name text, Student_rollno int, Student_name text, PRIMARY KEY (Course_name, Student_rollno) );
Mit der folgenden Abfrage kann ich einen Studierenden in einem bestimmten Kurs finden.
SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';
Beide Tabellen mรผssen jedes Mal beschrieben werden, wenn ein Student einem Kurs beitritt, normalerweise innerhalb eines einzigen Protokollierungsvorgangs, damit die beiden Kopien synchron bleiben.
gemeinsam Cassandra Fehler bei der Datenmodellierung
Die meisten mangelhaften Schemata wiederholen dieselben wenigen Fehler, und jedes tracEs ist eine Rรผckkehr zu einer Gewohnheit, die aus dem relationalen Design stammt.
- Unbegrenzte Partitionen: Die Wahl eines Partitionsschlรผssels wie beispielsweise eines Lรคndernamens fรผhrt dazu, dass Millionen von Zeilen in einer einzigen Partition zusammengefasst werden. Um die Partitionen in einer sinnvollen Grรถรe zu halten, kann ein Zeitintervall hinzugefรผgt werden, beispielsweise (Land, Monat).
- Schlรผssel mit sehr niedriger Kardinalitรคt: Ein Partitionsschlรผssel mit nur wenigen mรถglichen Werten, wie beispielsweise einem Statusflag, konzentriert den gesamten Datenverkehr auf wenige Knoten und lรคsst die รผbrigen ungenutzt.
- Um eine Abfrage zum Laufen zu bringen, verwenden Sie ALLOW FILTERING: Es durchsucht jede Partition und verschleiert dabei ein Modellierungsproblem. Falls eine Abfrage eine weitere Tabelle benรถtigt, benรถtigt das Schema diese.
- Modellierung von Entitรคten anstelle von Abfragen: Das Erstellen einer Tabelle fรผr Studenten und einer Tabelle fรผr Kurse und der anschlieรende Versuch, diese in der Anwendung zu verknรผpfen, widerspricht dem Zweck des Designs.
- Hรคufiges Lรถschen und รberschreiben: Jeder Lรถschvorgang erzeugt einen Tombstone, der gelesen und รผbersprungen werden muss, bis er durch die Komprimierung entfernt wird. Dies verlangsamt Lesevorgรคnge auf hรคufig genutzten Partitionen.
Durch das Vermeiden dieser Fehler bleibt das Schema im Einklang mit den oben auf dieser Seite genannten Regeln und den unten zusammengefassten relationalen Kontrasten.
Unterschied zwischen RDBMS und Cassandra Datenmodellierung
| RDBMS | Cassandra |
|---|---|
| Speichert Daten in normalisierter Form | Speichert Daten in denormalisierter Form |
| Legacy-DBMS; strukturierte Daten | Zeilenbasierter Speicher, dynamisch; strukturierte und unstrukturierte Daten |
| Schema ist um Entitรคten und ihre Beziehungen herum konzipiert. | Das Schema ist auf die Abfragen zugeschnitten, die die Anwendung ausfรผhren wird. |
| Joins, GROUP BY und beliebige WHERE-Klauseln werden unterstรผtzt. | Keine Joins oder willkรผrliche Filterung; Abfragen mรผssen mit dem Primรคrschlรผssel รผbereinstimmen. |
| Eine Tabelle dient รผblicherweise vielen verschiedenen Abfragen. | Eine Tabelle dient typischerweise einer Abfrage, daher werden Daten in mehreren Tabellen dupliziert. |
| Referenzielle Integritรคt wird durch Fremdschlรผssel erzwungen | Keine Fremdschlรผssel; die Konsistenz zwischen duplizierten Tabellen liegt in der Verantwortung der Anwendung. |
Diese Schemaentscheidungen werden in der Praxis angewendet in der Cassandra Tabelle und Schlรผsselraum Tutorials.
