Cassandra Datamodell med enkelt databasexempel

โšก Smart sammanfattning

Cassandra Datamodellregler inverterar vanorna inom relationsdesign: tabeller byggs fรถr frรฅgor snarare รคn fรถr entiteter. Den hรคr sidan behandlar kรคrnreglerna, val av partitionsnycklar och bearbetade scheman fรถr en-till-en-, en-till-mรฅnga- och mรฅnga-till-mรฅnga-relationer.

  • โœ๏ธ Skrivningar รคr billiga: Cassandra รคr optimerad fรถr skrivdataflรถde, sรฅ att duplicera data รถver tabeller รคr det accepterade sรคttet att gรถra lรคsningar snabba.
  • ๐Ÿ“‹ Frรฅga fรถrst: Lista de frรฅgor som programmet mรฅste besvara och skapa sedan en tabell per frรฅga istรคllet fรถr en tabell per entitet.
  • ๐Ÿ”‘ Partitionsnyckel: Det fรถrsta elementet i primรคrnyckeln avgรถr vilken nod som lagrar raden och dรคrmed hur jรคmnt data sprids.
  • ๐Ÿงฉ ClusterKolumner: De รฅterstรฅende primรคra nyckelelementen sorterar rader inuti en partition och aktiverar intervallfrรฅgor.
  • ๐Ÿ“ Partitionsstorlek: Fรถr fรฅ partitioner skapar hotspots och รถverdimensionerade rader; fรถr mรฅnga tvingar en lรคsning att besรถka mรฅnga noder.
  • ๐Ÿ”— relationer: En-till-en behรถver en enda tabell, en-till-mรฅnga behรถver en sammansatt nyckel och mรฅnga-till-mรฅnga behรถver en tabell per frรฅgeriktning.

Cassandra Exempel pรฅ datamodell

ร„ven Cassandra frรฅgesprรฅk liknar SQL sprรฅk, รคr deras datamodelleringsmetoder helt olika.

In Cassandra, kan en dรฅlig datamodell fรถrsรคmra prestandan, sรคrskilt nรคr anvรคndare fรถrsรถker implementera RDBMS-koncepten pรฅ Cassandra. Det รคr bรคst att tรคnka pรฅ nรฅgra regler som beskrivs nedan.

Cassandra Datamodellregler

In Cassandra, skriver รคr inte dyra. Cassandra stรถder inte joins, group by, OR-klausul, aggregering etc. Sรฅ du mรฅste lagra dina data pรฅ ett sรฅdant sรคtt att de ska vara helt รฅtertagbara. Sรฅ dessa regler mรฅste hรฅllas i รฅtanke nรคr data modelleras in Cassandra.

Maximera antalet skrivningar

In Cassandra, skriver รคr mycket billiga. Cassandra รคr optimerad fรถr hรถg skrivprestanda. Sรฅ fรถrsรถk att maximera dina skrivningar fรถr bรคttre lรคsprestanda och datatillgรคnglighet. Det finns en avvรคgning mellan dataskrivning och datalรคsning. Sรฅ optimera din datalรคsprestanda genom att maximera antalet dataskrivningar.

Maximera dataduplicering

Datadenormalisering och dataduplicering รคr defacto of Cassandra. Diskutrymme รคr inte dyrare รคn minne, CPU-bearbetning och IO-drift. Som Cassandra รคr en distribuerad databas, sรฅ dataduplicering ger omedelbar datatillgรคnglighet och ingen enskild felpunkt.

Cassandra Datamodelleringsmรฅl

Du bรถr ha fรถljande mรฅl nรคr du modellerar in data Cassandra:

Sprid data jรคmnt runt Cluster

Du vill ha lika mycket data pรฅ varje nod av Cassandra ClusterData sprids till olika noder baserat pรฅ partitionsnycklar som รคr den fรถrsta delen av primรคrnyckeln. Fรถrsรถk dรคrfรถr att vรคlja en kolumn med hรถg kardinalitet som partitionsnyckel fรถr att sprida data jรคmnt runt klustret.

Minimera antalet partitioner som lรคses nรคr du frรฅgar efter data

Partition รคr en grupp poster med samma partitionsnyckel. Nรคr lรคsfrรฅgan utfรคrdas samlar den in data frรฅn olika noder frรฅn olika partitioner.

Om det kommer att finnas mรฅnga partitioner, mรฅste alla dessa partitioner besรถkas fรถr att samla in frรฅgedata.

Det betyder inte att partitioner inte ska skapas. Om dina data รคr vรคldigt stora kan du inte lagra den enorma mรคngden data pรฅ en enda partition. Den enskilda partitionen kommer att bli lรฅngsammare.

Sรฅ fรถrsรถk att vรคlja ett balanserat antal partitioner.

Bra primรคr nyckel in Cassandra

Bรฅda mรฅlen ovan handlar om ett enda beslut, sรฅ de tvรฅ scheman nedan visar samma tabell med en dรฅlig nyckel och sedan en sund.

Lรฅt oss ta ett exempel och hitta vilken primรคrnyckel som รคr bra.

Hรคr รคr tabellen MusicPlaylist.

CREATE TABLE MusicPlaylist (
    SongId int,
    SongName text,
    Year int,
    Singer text,
    PRIMARY KEY (SongId, SongName)
);

I exemplet ovan, tabellen MusicPlaylist,

  • SongId รคr partitionsnyckeln, och
  • SongName รคr klustringskolumnen
  • Data kommer att klustras baserat pรฅ SongName. Endast en partition kommer att skapas per SongId, och eftersom varje lรฅt har en distinkt identifierare innehรฅller varje partition en enda rad.

Datainhรคmtningen kommer att gรฅ lรฅngsamt av denna datamodell pรฅ grund av den dรฅliga primรคrnyckeln.

Hรคr รคr en annan tabell MusicPlaylist.

CREATE TABLE MusicPlaylist (
    SongId int,
    SongName text,
    Year int,
    Singer text,
    PRIMARY KEY ((SongId, Year), SongName)
);

I exemplet ovan, tabellen MusicPlaylist,

  • SongId och Year รคr partitionsnyckeln, och
  • SongName รคr klustringskolumnen.
  • Data kommer att klustras pรฅ basis av SongName. I den hรคr tabellen kommer en ny partition att skapas varje รฅr. Alla รฅrets lรฅtar kommer att vara pรฅ samma nod. Denna primรคra nyckel kommer att vara mycket anvรคndbar fรถr data.

Vรฅr datahรคmtning kommer att gรฅ snabbt med denna datamodell.

Modellera dina data i Cassandra

Fรถljande saker bรถr tรคnkas pรฅ nรคr du modellerar dina frรฅgor:

Bestรคm vilka frรฅgor du vill stรถdja

Bestรคm fรถrst och frรคmst vilka frรฅgor du vill ha.

Behรถver du till exempel?

  • Fogar
  • Grupp av
  • Filtrera pรฅ vilken kolumn osv.

Skapa tabell enligt dina frรฅgor

Skapa tabell enligt dina frรฅgor. Skapa en tabell som kommer att tillfredsstรคlla dina frรฅgor. Fรถrsรถk att skapa en tabell pรฅ ett sรฅdant sรคtt att ett minimum antal partitioner behรถver lรคsas.

De tre avsnitten som fรถljer tillรคmpar den principen pรฅ de tre relationstyper som finns i nรคstan alla scheman.

Hantera ett till ett fรถrhรฅllande i Cassandra

En till en relation betyder att tvรฅ tabeller har en till en korrespondens. Studenten kan till exempel bara registrera en kurs, och jag vill sรถka pรฅ en student som i vilken kurs en viss student รคr registrerad i.

Sรฅ i det hรคr fallet bรถr ditt tabellschema omfatta alla detaljer om studenten som motsvarar den specifika kursen som kursens namn, elevens rollnummer, studentnamn, etc.

Ett till ett fรถrhรฅllande i Cassandra
Ett till ett fรถrhรฅllande i Cassandra

Diagrammet ovan visar en enda tabell som hanterar frรฅgan, eftersom en student mappas till exakt en kurs.

CREATE TABLE Student_Course (
    Student_rollno int PRIMARY KEY,
    Student_name text,
    Course_name text
);

Eftersom Student_rollno รคr partitionsnyckeln, lรคser en sรถkning efter rullnummer exakt en partition.

Hantera ett till mรฅnga fรถrhรฅllande i Cassandra

En till mรฅnga relationer innebรคr att ha en till mรฅnga รถverensstรคmmelse mellan tvรฅ tabeller.

Till exempel kan en kurs lรคsas av mรฅnga studenter. Jag vill sรถka efter alla studenter som lรคser en viss kurs.

Sรฅ genom att frรฅga efter kursnamn kommer jag att ha mรฅnga studentnamn som kommer att studera en viss kurs.

Ett till mรฅnga fรถrhรฅllande i Cassandra
Ett till mรฅnga fรถrhรฅllande i Cassandra

Hรคr blir kursnamnet partitionsnyckeln sรฅ att varje student pรฅ en kurs hamnar i samma partition, och rullnumret blir klusterkolumnen sรฅ att varje student fรถrblir en distinkt rad.

CREATE TABLE Student_Course (
    Course_name text,
    Student_rollno int,
    Student_name text,
    PRIMARY KEY (Course_name, Student_rollno)
);

Jag kan hรคmta alla elever fรถr en viss kurs genom fรถljande frรฅga.

SELECT * FROM Student_Course WHERE Course_name = 'Course Name';

Hantera mรฅnga till mรฅnga relationer i Cassandra

Mรฅnga till mรฅnga relationer innebรคr att ha mรฅnga till mรฅnga korrespondens mellan tvรฅ tabeller.

Till exempel kan en kurs lรคsas av mรฅnga studenter, och en student kan ocksรฅ lรคsa mรฅnga kurser.

Mรฅnga till mรฅnga relationer i Cassandra
Mรฅnga till mรฅnga relationer i Cassandra

Jag vill sรถka efter alla studenter som lรคser en viss kurs. Jag vill ocksรฅ sรถka igenom hela kursen som en viss student lรคser.

Sรฅ i det hรคr fallet kommer jag att ha tvรฅ tabeller, dvs. dela upp problemet i tvรฅ fall. Detta รคr den tydligaste illustrationen av dupliceringsregeln: samma fakta skrivs tvรฅ gรฅnger sรฅ att varje frรฅga lรคser en partition.

Fรถrst kommer jag att skapa en tabell dรคr du kan hitta kurser av en viss student.

CREATE TABLE Student_Course (
    Student_rollno int,
    Course_name text,
    Student_name text,
    PRIMARY KEY (Student_rollno, Course_name)
);

Jag kan hitta alla kurser av en viss student genom fรถljande frรฅga.

SELECT * FROM Student_Course WHERE Student_rollno = 101;

Fรถr det andra kommer jag att skapa en tabell dรคr du kan se hur mรฅnga studenter som lรคser en viss kurs.

CREATE TABLE Course_Student (
    Course_name text,
    Student_rollno int,
    Student_name text,
    PRIMARY KEY (Course_name, Student_rollno)
);

Jag kan hitta en student i en viss kurs genom fรถljande frรฅga.

SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';

Bรฅda tabellerna mรฅste skrivas till varje gรฅng en student gรฅr med i en kurs, normalt inom en enda loggad batch sรฅ att de tvรฅ kopiorna hรฅlls i takt.

Gemensam Cassandra Misstag i datamodellering

De flesta dรฅliga scheman upprepar samma handfull fel, och varje tracgรฅr tillbaka till en vana som รคr hรคmtad frรฅn relationell design.

  • Obegrรคnsade partitioner: Att vรคlja en partitionsnyckel, till exempel ett landsnamn, placerar miljontals rader i en partition. Lรคgg till en tidsperiod, till exempel (land, mรฅnad), fรถr att hรฅlla partitionerna inom en rimlig storlek.
  • Nycklar med mycket lรฅg kardinalitet: En partitionsnyckel med endast ett fรฅtal mรถjliga vรคrden, till exempel en statusflagga, koncentrerar all trafik till ett fรฅtal noder och lรคmnar resten inaktiv.
  • Anvรคnda ALLOW FILTERING fรถr att fรฅ en frรฅga att fungera: Den skannar varje partition och dรถljer ett modelleringsproblem. Om en frรฅga behรถver det behรถver schemat en annan tabell.
  • Modellera entiteter istรคllet fรถr frรฅgor: Att bygga en studenttabell och en kurstabell, och sedan fรถrsรถka koppla ihop dem i applikationen, omintetgรถr syftet med designen.
  • Ofta fรถrekommande borttagningar och รถverskrivningar: Varje borttagning skriver en tombstone som mรฅste lรคsas och hoppas รถver tills komprimering tar bort den, vilket saktar ner lรคsningar pรฅ heta partitioner.

Genom att undvika dessa bibehรฅlls schemat i linje med reglerna som anges hรถgst upp pรฅ denna sida, och med de relationella kontraster som sammanfattas nedan.

Skillnaden mellan RDBMS och Cassandra Datamodellering

RDBMS Cassandra
Lagrar data i normaliserad form Lagrar data i denormaliserad form
ร„ldre dbms; strukturerad data Bred radlagring, dynamisk; strukturerad och ostrukturerad data
Schemat รคr utformat kring entiteter och deras relationer Schemat รคr utformat kring de frรฅgor som applikationen kommer att kรถra
Joins, GROUP BY och godtyckliga WHERE-klausuler stรถds. Inga kopplingar eller godtycklig filtrering; frรฅgor mรฅste matcha primรคrnyckeln
En tabell hanterar vanligtvis mรฅnga olika frรฅgor En tabell hanterar vanligtvis en frรฅga, sรฅ data dupliceras mellan tabeller
Referensintegritet upprรคtthรฅlls av frรคmmande nycklar Inga frรคmmande nycklar; konsekvens mellan duplicerade tabeller รคr applikationens ansvar

Dessa schemabeslut tillรคmpas i praktiken i Cassandra bord och tangentutrymme Handledningar.

Vanliga frรฅgor

Sikta pรฅ under 100 MB och ungefรคr 100 000 rader per partition. Stรถrre partitioner gรถr lรคsningar lรฅngsammare, รถkar reparationstiden och รถkar minnesbelastningen under komprimering.

Partitionsnyckeln avgรถr vilken nod som lagrar raden. ClusterKolumner som anger sorteringsordningen fรถr rader inom den partitionen och tillรฅter intervallfrรฅgor, till exempel ett datumintervall.

Materialiserade vyer automatiserar dupliceringen, men de รคr fortfarande en experimentell funktion med kรคnda konsistensfall. De flesta produktionsscheman behรฅller fortfarande den andra tabellen frรฅn applikationen.

AI kan รถversรคtta entiteter till kandidattabeller, men en Cassandra Schemat fรถljer frรฅgor snarare รคn entiteter. Ange frรฅgelistan fรถrst och behandla sedan de genererade tabellerna som utkast fรถr att validera mot partitionsstorleken.

Givet kolumnkardinalitet och fรถrvรคntat radantal kan AI flagga nycklar som sannolikt skapar hotspots eller obegrรคnsade partitioner. Bekrรคfta varningen med nodetool tablehistograms nรคr verkliga data har laddats.

Sammanfatta detta inlรคgg med: