Cassandra Andmemudel lihtsa andmebaasi näitega

⚡ Nutikas kokkuvõte

Cassandra Andmemudeli reeglid pööravad relatsioonilise disaini harjumused vastupidiseks: tabeleid luuakse päringute, mitte üksuste jaoks. See leht hõlmab põhireegleid, partitsioonivõtme valikut ja tööskeeme üks-ühele, üks-mitmele ja mitu-mitmele seoste jaoks.

  • ✍️ Kirjutamine on odav: Cassandra on kirjutamisläbilaskvuse jaoks optimeeritud, seega on andmete dubleerimine tabelite vahel aktsepteeritud viis lugemiste kiireks tegemiseks.
  • ???? Esimene päring: Loetlege päringud, millele rakendus peab vastama, ja looge seejärel iga päringu kohta eraldi tabel, mitte iga üksuse kohta eraldi tabel.
  • 🔑 Partitsioonivõti: Primaarvõtme esimene element otsustab, millises sõlmes rida salvestatakse ja seega kui ühtlaselt andmed jaotuvad.
  • 🧩 Clusterveerud: Ülejäänud primaarvõtme elemendid sorteerivad partitsiooni sees olevaid ridu ja lubavad vahemiku päringuid.
  • 📏 Partitsiooni suurus: Liiga vähe partitsioone loob levialasid ja ülemõõdulisi ridu; liiga palju partitsioone sunnib lugemist külastama paljusid sõlmi.
  • 🔗 Suhted: Üks-ühele päringu jaoks on vaja ühte tabelit, üks-mitmele päringu jaoks liitvõtit ja mitu-mitmele päringu jaoks ühte tabelit päringusuuna kohta.

Cassandra Andmemudeli näide

Kuigi Cassandra päringukeel sarnaneb SQL keeles, on nende andmemodelleerimismeetodid täiesti erinevad.

In Cassandra, võib halb andmemudel jõudlust halvendada, eriti kui kasutajad proovivad RDBMS-i kontseptsioone sisse viia Cassandra. Parim on meeles pidada mõnda allpool kirjeldatud reeglit.

Cassandra Andmemudeli reeglid

In Cassandra, kirjutised pole kallid. Cassandra ei toeta liitumisi, rühmitamist, VÕI-klauslit, koondamisi jne. Seega peate oma andmed salvestama nii, et need oleksid täielikult taastatavad. Seega tuleb neid reegleid andmete modelleerimisel meeles pidada Cassandra.

Maksimeerige kirjutamiste arv

In Cassandra, kirjutised on väga odavad. Cassandra on optimeeritud suure kirjutamisjõudluse saavutamiseks. Seega proovige oma kirjutamisvõimsust maksimeerida, et saavutada parem lugemisjõudlus ja andmete kättesaadavus. Andmete kirjutamise ja lugemise vahel on kompromiss. Seega optimeerige oma andmete lugemise jõudlust, maksimeerides andmete kirjutamise arvu.

Maksimeerige andmete dubleerimine

Andmete denormaliseerimine ja andmete dubleerimine on defacto Cassandra. Kettaruum ei ole kallim kui mälu, protsessori töötlemine ja IO-de töö. Nagu Cassandra on hajutatud andmebaas, nii et andmete dubleerimine tagab andmete kohese kättesaadavuse ja pole ühtegi tõrkepunkti.

Cassandra Andmete modelleerimise eesmärgid

Andmete modelleerimisel peaksid teil olema järgmised eesmärgid Cassandra:

Jaotage andmed ühtlaselt ümber Cluster

Soovite võrdsel hulgal andmeid iga sõlme kohta Cassandra ClusterAndmed jaotatakse erinevate sõlmede vahel partitsioonivõtmete alusel, mis on primaarvõtme esimene osa. Seega proovige partitsioonivõtmeks valida kõrge kardinaalsusega veerg, et andmeid klastris ühtlaselt jaotada.

Minimeerige andmete pärimise ajal loetavate partitsioonide arv

Partitsioon on sama partitsioonivõtmega kirjete rühm. Kui lugemispäring väljastatakse, kogub see andmeid erinevatest sektsioonidest erinevatest sõlmedest.

Kui partitsioone on palju, tuleb päringuandmete kogumiseks külastada kõiki neid sektsioone.

See ei tähenda, et partitsioone ei tohiks luua. Kui teie andmed on väga suured, ei saa te seda tohutut andmemahtu ühel partitsioonil hoida. See aeglustab üksikut partitsiooni.

Nii et proovige valida tasakaalustatud partitsioonide arv.

Hea esmane võti Cassandra

Mõlemad ülaltoodud eesmärgid taanduvad ühele otsusele, seega näitavad kaks allolevat skeemi sama tabelit halva ja seejärel õige võtmega.

Võtame näite ja leiame, milline primaarvõti on hea.

Siin on tabel MusicPlaylist.

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

Ülaltoodud näites tabelis MusicPlaylist,

  • SongId on partitsioonivõti ja
  • SongName on klastrite veerg
  • Andmed klasterdatakse SongName'i alusel. SongId kohta luuakse ainult üks partitsioon ja kuna igal lool on eraldi identifikaator, on igas partitsioonis üks rida.

Selle andmemudeli tõttu on andmete toomine kehva primaarvõtme tõttu aeglane.

Siin on veel üks tabel MusicPlaylist.

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

Ülaltoodud näites tabelis MusicPlaylist,

  • SongId ja Year on partitsioonivõti ja
  • SongName on klastrite veerg.
  • Andmed rühmitatakse SongName'i alusel. Selles tabelis luuakse igal aastal uus partitsioon. Kõik aasta laulud jäävad samale sõlmele. See primaarvõti on andmete jaoks väga kasulik.

Selle andmemudeli abil on meie andmete hankimine kiire.

Modelleerige oma andmed Cassandra

Päringute modelleerimisel tuleks meeles pidada järgmisi asju.

Määrake, milliseid päringuid soovite toetada

Kõigepealt määrake kindlaks, milliseid päringuid soovite.

Näiteks kas vajate?

  • Liita
  • Grupi poolt
  • Filtreerimine millise veeru järgi jne.

Koostage tabel vastavalt oma päringutele

Koostage tabel vastavalt oma päringutele. Looge tabel, mis rahuldab teie päringuid. Proovige luua tabel nii, et oleks vaja lugeda minimaalset arvu partitsioone.

Järgnevad kolm osa rakendavad seda põhimõtet peaaegu igas skeemis leiduvatele kolmele suhtetüübile.

Üks-ühele suhete käsitlemine Cassandra

Üks ühele seos tähendab, et kahel tabelil on üks ühele vastavus. Näiteks saab üliõpilane registreerida ainult ühe kursuse ja ma tahan õpilase pealt otsida, millisele kursusele konkreetne õpilane on registreerunud.

Sellisel juhul peaks teie tabeliskeem hõlmama kõiki konkreetsele kursusele vastava õpilase üksikasju, nagu kursuse nimi, õpilase number, õpilase nimi jne.

Üks ühele suhe sisse Cassandra
Üks ühele suhe sisse Cassandra

Ülaltoodud diagramm näitab päringut teenindavat ühte tabelit, kuna üks üliõpilane on seotud täpselt ühe kursusega.

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

Kuna õpilase_rollinumber on partitsioonivõti, loeb õpilase_rollinumbri järgi otsimine täpselt ühte partitsiooni.

Üks paljudele suhete käsitlemine Cassandra

Üks kuni mitu seost tähendab, et kahe tabeli vahel on üks kuni mitu vastavust.

Näiteks kursust saavad õppida paljud õpilased. Soovin otsida kõiki õpilasi, kes õpivad konkreetsel kursusel.

Nii et kui küsin kursuse nime järgi, saan teada paljude õpilaste nimesid, kes õpivad konkreetset kursust.

Üks paljudele suhe sisse Cassandra
Üks paljudele suhe sisse Cassandra

Siin saab kursuse nimest partitsioonivõti, nii et iga kursuse õpilane satub samasse partitsiooni, ja rulli number saab klastrite veerguks, nii et iga õpilane jääb eraldi reale.

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

Saan leida kõik konkreetse kursuse õpilased järgmise päringu abil.

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

Paljude ja mitmete suhete käsitlemine Cassandra

Paljud-palju seosed tähendavad, et kahe tabeli vahel on palju või palju vastavust.

Näiteks võib ühte kursust õppida palju tudengeid ja ka tudeng võib õppida paljusid kursusi.

Paljud paljudele suhe sisse Cassandra
Paljud paljudele suhe sisse Cassandra

Soovin otsida kõiki õpilasi, kes õpivad konkreetsel kursusel. Samuti tahan otsida kõiki kursusi, mida konkreetne üliõpilane õpib.

Seega on mul sel juhul kaks tabelit, st jagan probleemi kaheks juhtumiks. See on dubleerimisreegli kõige selgem näide: samad faktid kirjutatakse kaks korda, nii et iga päring loeb ühte partitsiooni.

Kõigepealt koostan tabeli, mille järgi leiad konkreetse õpilase kursused.

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

Leian kõik konkreetse õpilase kursused järgmise päringu abil.

SELECT * FROM Student_Course WHERE Student_rollno = 101;

Teiseks koostan tabeli, mille järgi saate teada, kui palju õpilasi konkreetsel kursusel õpib.

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

Leian mõne konkreetse kursuse õpilase järgmise päringu abil.

SELECT * FROM Course_Student WHERE Course_name = 'Cassandra';

Mõlemasse tabelisse tuleb kirjutada iga kord, kui üliõpilane kursusega liitub, tavaliselt ühe logitud partii sees, et kaks koopiat püsiksid samas tempos.

ühine Cassandra Andmete modelleerimise vead

Enamik halbu skeeme kordab samu vigu ja igaüks neist tracnaaseb relatsioonilisest disainist üle kantud harjumuse juurde.

  • Piiramata partitsioonid: Partitsioonivõtme, näiteks riigi nime valimine, paigutab miljonid read ühte partitsiooni. Partitsioonide mõistliku suuruse piires hoidmiseks lisage ajavahemik, näiteks (riik, kuu).
  • Väga madala kardinaalsusega võtmed: Ainult mõne võimaliku väärtusega partitsioonivõti, näiteks oleku lipp, koondab kogu liikluse vähestele sõlmedele ja jätab ülejäänud jõude.
  • Päringu toimima panemiseks kasutage funktsiooni ALLOW FILTERING: See skannib iga partitsiooni ja peidab modelleerimisprobleemi. Kui päring seda vajab, vajab skeem teist tabelit.
  • Päringute asemel üksuste modelleerimine: Õpilaste tabeli ja kursuste tabeli loomine ning seejärel nende rakenduses ühendamine läheb disaini eesmärgist mööda.
  • Sagedased kustutamised ja ülekirjutused: Iga kustutamine loob hauakivi, mida tuleb lugeda ja vahele jätta, kuni tihendamine selle eemaldab, mis aeglustab lugemist kuumadel partitsioonidel.

Nende vältimine hoiab skeemi vastavuses selle lehe ülaosas toodud reeglitega ja allpool kokkuvõtlikult esitatud relatsiooniliste erinevustega.

Erinevus RDBMS-i ja Cassandra Andmete modelleerimine

RDBMS Cassandra
Salvestab andmed normaliseeritud kujul Salvestab andmeid denormaliseeritud kujul
Pärand dbms; struktureeritud andmed Laia reaga salvestusruum, dünaamiline; struktureeritud ja struktureerimata andmed
Skeem on loodud üksuste ja nende suhete ümber Skeem on loodud päringute ümber, mida rakendus käivitab
Toetatud on liitmised, GROUP BY ja suvalised WHERE-klauslid Liitmisi ega suvalist filtreerimist ei toimu; päringud peavad vastama primaarvõtmele
Üks tabel teenindab tavaliselt palju erinevaid päringuid Üks tabel teenindab tavaliselt ühte päringut, seega andmed dubleeritakse tabelite vahel.
Võõrvõtmete abil jõustatud viiteterviklikkus Võõrvõtmeid pole; dubleeritud tabelite omavahelise järjepidevuse eest vastutab rakendus.

Neid skeemiotsuseid rakendatakse praktikas Cassandra tabel ja klahviruum õpetused.

KKK

Püüdke saavutada alla 100 MB ja umbes 100 000 rea suurust mahtu partitsiooni kohta. Suuremad partitsioonid aeglustavad lugemist, suurendavad parandamise aega ja suurendavad mälukoormust tihendamise ajal.

Partitsioonivõti otsustab, milline sõlm rida salvestab. ClusterVeergude sortimine määrab selle partitsiooni ridade sortimisjärjekorra ja võimaldab vahemiku päringuid, näiteks kuupäevavahemikku.

Materialiseeritud vaated automatiseerivad dubleerimist, kuid need jäävad eksperimentaalseks funktsiooniks, millel on teadaolevad järjepidevuse äärmusjuhtumid. Enamik tootmisskeeme säilitab endiselt rakenduse teise tabeli.

Tehisintellekt saab üksusi kandidaattabeliteks teisendada, aga a Cassandra Skeem järgib päringuid, mitte üksusi. Esitage esmalt päringute loend ja seejärel käsitlege genereeritud tabeleid mustanditena, et valideerida need partitsiooni suuruse suhtes.

Arvestades veergude kardinaalsust ja eeldatavat ridade arvu, saab tehisintellekt märkida võtmed, mis tõenäoliselt loovad levialasid või piiramata partitsioone. Kinnitage hoiatus nodetool tablehistograms abil, kui reaalsed andmed on laaditud.

Võta see postitus kokku järgmiselt: