Cassandra Datamodell med enkelt databaseeksempel

โšก Smart oppsummering

Cassandra Regler for datamodeller inverterer vanene ved relasjonsdesign: tabeller bygges for spรธrringer i stedet for for enheter. Denne siden dekker kjernereglene, valg av partisjonsnรธkkel og bearbeidede skjemaer for รฉn-til-รฉn-, รฉn-til-mange- og mange-til-mange-relasjoner.

  • โœ๏ธ Skriver er billige: Cassandra er optimalisert for skrivegjennomstrรธmning, sรฅ duplisering av data pรฅ tvers av tabeller er den aksepterte mรฅten รฅ gjรธre lesinger raske pรฅ.
  • ???? Spรธrsmรฅl fรธrst: List opp spรธrringene applikasjonen mรฅ svare pรฅ, og opprett deretter รฉn tabell per spรธrring i stedet for รฉn tabell per enhet.
  • ๐Ÿ”‘ Partisjonsnรธkkel: Det fรธrste elementet i primรฆrnรธkkelen bestemmer hvilken node som lagrer raden og dermed hvor jevnt dataene spres.
  • ๐Ÿงฉ ClusterKolonner: De resterende primรฆre nรธkkelelementene sorterer rader i en partisjon og aktiverer omrรฅdespรธrringer.
  • ๐Ÿ“ Partisjonsstรธrrelse: For fรฅ partisjoner oppretter hotspots og overdimensjonerte rader; for mange tvinger en lesning til รฅ besรธke mange noder.
  • ๐Ÿ”— Forhold: En-til-en trenger รฉn tabell, รฉn-til-mange trenger en sammensatt nรธkkel, og mange-til-mange trenger รฉn tabell per spรธrreretning.

Cassandra Eksempel pรฅ datamodell

Selv Cassandra spรธrresprรฅket ligner SQL sprรฅk, er deres datamodelleringsmetoder helt forskjellige.

In Cassandra, kan en dรฅrlig datamodell forringe ytelsen, spesielt nรฅr brukere prรธver รฅ implementere RDBMS-konseptene pรฅ Cassandra. Det er best รฅ huske pรฅ noen regler beskrevet nedenfor.

Cassandra Datamodellregler

In Cassandra, skriver er ikke dyre. Cassandra stรธtter ikke joins, group by, OR-klausul, aggregeringer osv. Sรฅ du mรฅ lagre dataene dine pรฅ en slik mรฅte at de skal vรฆre fullstendig gjenfinnbare. Sรฅ disse reglene mรฅ huskes nรฅr du modellerer data Cassandra.

Maksimer antall skrivinger

In Cassandra, skriver er veldig billig. Cassandra er optimalisert for hรธy skriveytelse. Sรฅ prรธv รฅ maksimere skrivingene dine for bedre leseytelse og datatilgjengelighet. Det er en avveining mellom dataskriving og datalesing. Sรฅ optimaliser dataleseytelsen din ved รฅ maksimere antall dataskrivinger.

Maksimer dataduplisering

Datadenormalisering og dataduplisering er defacto of Cassandra. Diskplass er ikke dyrere enn minne, CPU-behandling og IO-drift. Som Cassandra er en distribuert database, sรฅ dataduplisering gir umiddelbar datatilgjengelighet og ikke noe enkelt punkt for feil.

Cassandra Mรฅl for datamodellering

Du bรธr ha fรธlgende mรฅl mens du modellerer data Cassandra:

Spre data jevnt rundt Cluster

Du vil ha en lik mengde data pรฅ hver node av Cassandra ClusterData spres til forskjellige noder basert pรฅ partisjonsnรธkler som er den fรธrste delen av primรฆrnรธkkelen. Prรธv derfor รฅ velge en kolonne med hรธy kardinalitet som partisjonsnรธkkel for รฅ spre data jevnt rundt klyngen.

Minimer antall partisjoner som leses mens du spรธr etter data

Partisjon er en gruppe poster med samme partisjonsnรธkkel. Nรฅr lesespรธrringen utstedes, samler den inn data fra forskjellige noder fra forskjellige partisjoner.

Hvis det vil vรฆre mange partisjoner, mรฅ alle disse partisjonene besรธkes for รฅ samle inn spรธrringsdataene.

Det betyr ikke at partisjoner ikke skal opprettes. Hvis dataene dine er veldig store, kan du ikke lagre den enorme mengden data pรฅ den ene partisjonen. Den ene partisjonen vil bli tregere.

Sรฅ prรธv รฅ velge et balansert antall partisjoner.

God primรฆrnรธkkel inn Cassandra

Begge mรฅlene ovenfor kommer ned til รฉn avgjรธrelse, sรฅ de to skjemaene nedenfor viser den samme tabellen med en dรฅrlig nรธkkel og deretter en god en.

La oss ta et eksempel og finne ut hvilken primรฆrnรธkkel som er god.

Her er tabellen MusicPlaylist.

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

I eksemplet ovenfor, tabellen MusicPlaylist,

  • SongId er partisjonsnรธkkelen, og
  • SongName er klyngekolonnen
  • Dataene vil bli gruppert basert pรฅ sangnavn. Bare รฉn partisjon vil bli opprettet per sang-ID, og โ€‹โ€‹fordi hver sang har en distinkt identifikator, inneholder hver partisjon รฉn rad.

Datainnhentingen vil gรฅ tregt av denne datamodellen pรฅ grunn av den dรฅrlige primรฆrnรธkkelen.

Her er en annen tabell MusicPlaylist.

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

I eksemplet ovenfor, tabellen MusicPlaylist,

  • SongId og Year er partisjonsnรธkkelen, og
  • SongName er klyngekolonnen.
  • Data vil bli gruppert pรฅ grunnlag av SongName. I denne tabellen vil det bli opprettet en ny partisjon hvert รฅr. Alle รฅrets sanger vil vรฆre pรฅ samme node. Denne primรฆrnรธkkelen vil vรฆre svรฆrt nyttig for dataene.

Datainnhentingen vรฅr vil vรฆre rask med denne datamodellen.

Modeller dataene dine inn Cassandra

Fรธlgende ting bรธr huskes nรฅr du modellerer sรธkene dine:

Bestem hvilke spรธrsmรฅl du vil stรธtte

Fรธrst av alt, bestemme hvilke sรธk du vil ha.

Trenger du for eksempel?

  • tiltrer
  • Gruppe av
  • Filtrering pรฅ hvilken kolonne osv.

Lag tabell i henhold til dine spรธrsmรฅl

Lag tabell i henhold til dine spรธrsmรฅl. Lag en tabell som vil tilfredsstille dine spรธrsmรฅl. Prรธv รฅ lage en tabell pรฅ en slik mรฅte at et minimum antall partisjoner mรฅ leses.

De tre avsnittene som fรธlger, anvender dette prinsippet pรฅ de tre relasjonstypene som finnes i nesten alle skjemaer.

Hรฅndtere ett til ett forhold i Cassandra

En til en relasjon betyr at to tabeller har en til en korrespondanse. For eksempel kan studenten registrere kun ett emne, og jeg รธnsker รฅ sรธke pรฅ en student som i hvilket emne en bestemt student er registrert i.

Sรฅ i dette tilfellet bรธr tabellskjemaet ditt omfatte alle detaljene til studenten i samsvar med det aktuelle kurset, som navnet pรฅ kurset, rullenummeret til studenten, studentnavnet osv.

Ett til ett forhold i Cassandra
Ett til ett forhold i Cassandra

Diagrammet ovenfor viser รฉn enkelt tabell som betjener spรธrringen, fordi รฉn student er tilordnet nรธyaktig ett kurs.

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

Fordi Student_rollno er partisjonsnรธkkelen, leser et oppslag etter rullnummer nรธyaktig รฉn partisjon.

Hรฅndtere ett til mange forhold i Cassandra

En til mange relasjoner betyr รฅ ha en til mange korrespondanse mellom to tabeller.

For eksempel kan et emne studeres av mange studenter. Jeg vil sรธke etter alle studentene som studerer et bestemt emne.

Sรฅ ved รฅ spรธrre pรฅ emnenavn, vil jeg ha mange studentnavn som skal studere et bestemt emne.

En til mange forhold i Cassandra
En til mange forhold i Cassandra

Her blir kursnavnet partisjonsnรธkkelen slik at alle studentene i et kurs havner i samme partisjon, og rullenummeret blir klyngekolonnen slik at hver student forblir en egen rad.

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

Jeg kan hente alle studentene for et bestemt kurs ved รฅ bruke fรธlgende spรธrring.

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

Hรฅndtere mange til mange forhold i Cassandra

Mange til mange relasjoner betyr รฅ ha mange til mange korrespondanse mellom to tabeller.

For eksempel kan et emne studeres av mange studenter, og en student kan ogsรฅ studere mange emner.

Mange til mange forhold i Cassandra
Mange til mange forhold i Cassandra

Jeg vil sรธke etter alle studentene som studerer et bestemt emne. Jeg รธnsker ogsรฅ รฅ sรธke i hele kurset som en bestemt student studerer.

Sรฅ i dette tilfellet vil jeg ha to tabeller, dvs. dele problemet inn i to tilfeller. Dette er den tydeligste illustrasjonen av dupliseringsregelen: de samme faktaene skrives to ganger, slik at hver spรธrring leser รฉn partisjon.

Fรธrst vil jeg lage en tabell der du kan finne kurs av en bestemt student.

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

Jeg kan finne alle kursene til en bestemt student ved รฅ fรธlge spรธrsmรฅlet nedenfor.

SELECT * FROM Student_Course WHERE Student_rollno = 101;

For det andre vil jeg lage en tabell der du kan finne hvor mange studenter som studerer et bestemt kurs.

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

Jeg kan finne en student i et bestemt kurs ved รฅ fรธlge spรธrsmรฅlet nedenfor.

SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';

Begge tabellene mรฅ skrives til hver gang en student blir med i et kurs, vanligvis innenfor รฉn loggfรธrt gruppe, slik at de to kopiene holder takt.

Felles Cassandra Feil i datamodellering

De fleste dรฅrlige skjemaer gjentar den samme hรฅndfullen feil, og hver tracgรฅr tilbake til en vane overfรธrt fra relasjonsdesign.

  • Ubegrensede partisjoner: ร… velge en partisjonsnรธkkel, for eksempel et landsnavn, legger millioner av rader inn i รฉn partisjon. Legg til en tidsramme, for eksempel (land, mรฅned), for รฅ holde partisjonene innenfor en fornuftig stรธrrelse.
  • Nรธkler med svรฆrt lav kardinalitet: En partisjonsnรธkkel med bare noen fรฅ mulige verdier, for eksempel et statusflagg, konsentrerer all trafikk pรฅ noen fรฅ noder og lar resten vรฆre inaktiv.
  • Bruk ALLOW FILTERING for รฅ fรฅ en spรธrring til รฅ fungere: Den skanner hver partisjon og skjuler et modelleringsproblem. Hvis en spรธrring trenger det, trenger skjemaet en annen tabell.
  • Modellering av enheter i stedet for spรธrringer: ร… bygge en studenttabell og en kurstabell, og deretter prรธve รฅ koble dem sammen i applikasjonen, motvirker designets formรฅl.
  • Hyppige slettinger og overskrivinger: Hver sletting skriver en tombstone som mรฅ leses og hoppes over inntil komprimering fjerner den, noe som reduserer lesingen pรฅ aktive partisjoner.

Ved รฅ unngรฅ disse holdes skjemaet i samsvar med reglene som er angitt รธverst pรฅ denne siden, og med de relasjonelle kontrastene som er oppsummert nedenfor.

Forskjellen mellom RDBMS og Cassandra Datamodellering

RDBMS Cassandra
Lagrer data i normalisert form Lagrer data i denormalisert form
Legacy dbms; strukturerte data Bred radlagring, dynamisk; strukturerte og ustrukturerte data
Skjemaet er utformet rundt enheter og deres relasjoner Skjemaet er utformet rundt spรธrringene applikasjonen vil kjรธre
Joins, GROUP BY og vilkรฅrlige WHERE-klausuler stรธttes Ingen sammenfรธyninger eller vilkรฅrlig filtrering; spรธrringer mรฅ samsvare med primรฆrnรธkkelen
ร‰n tabell betjener vanligvis mange forskjellige spรธrringer ร‰n tabell betjener vanligvis รฉn spรธrring, sรฅ data dupliseres pรฅ tvers av tabeller
Referanseintegritet hรฅndhevet av fremmednรธkler Ingen fremmednรธkler; konsistens mellom dupliserte tabeller er applikasjonens ansvar

Disse skjemaavgjรธrelsene anvendes i praksis i Cassandra bord og tasterom opplรฆringsprogrammer.

Spรธrsmรฅl og svar

Sikt pรฅ under 100 MB og omtrent 100 000 rader per partisjon. Stรธrre partisjoner reduserer lesingen, รธker reparasjonstiden og รธker minnetrykket under komprimering.

Partisjonsnรธkkelen bestemmer hvilken node som lagrer raden. ClusterKolonner bestemmer sorteringsrekkefรธlgen for rader i den partisjonen og tillater omrรฅdespรธrringer, for eksempel et datointervall.

Materialiserte visninger automatiserer dupliseringen, men de er fortsatt en eksperimentell funksjon med kjente konsistensgrensetilfeller. De fleste produksjonsskjemaer beholder fortsatt den andre tabellen fra applikasjonen.

AI kan oversette enheter til kandidattabeller, men en Cassandra Skjemaet fรธlger spรธrringer i stedet for enheter. Angi spรธrrelisten fรธrst, og behandle deretter de genererte tabellene som utkast for รฅ validere mot partisjonsstรธrrelsen.

Gitt kolonnekardinalitet og forventet radantall, kan AI flagge nรธkler som sannsynligvis vil opprette hotspots eller ubegrensede partisjoner. Bekreft advarselen med nodetool tablehistograms nรฅr reelle data er lastet inn.

Oppsummer dette innlegget med: