Send til redaktion@dotnyt.dk hvis du har feedback, gode idéer, konstruktiv kritik eller svinere. Alt har interesse!
Tippet om kopiering af data kommer fra et foredrag fra Mark Brown, Program Manager fra Microsoft
Sidste gang talte vi om hvad partitionering egentligt er og dette afsnit forudsætter at du har en grundlæggende forståelse for partitionering, så hvis du missede sidste afsnit så anbefaler jeg du hører det først.
I dag tager jeg fat i et konkret eksempel som en videohosting-service til virksomheder. Så virksomheder tilmelder sig denne service og så kan de lægge videoer op på en sikker måde og dele dem med medarbejdere og kunder.
Med det udgangspunkt, lad os tænke over vores database og vi starter fra toppen med en kundetabel. Husk grænseværdien som er 10 GB data per partition. En liste af kunder kommer formentlig aldrig til at fylde mere end 10 GB så du kan godt vælge at undlade at partitionere din kundetabel.
Den anden grund vi skal overveje ifht partitionering er hvordan data tilgås. I de fleste tilfælde tilgår man nok hele kundelisten (eller en enkelt kunde) og så giver det ikke mening at partitionere. Måske hvis man har landepartnere som “ejer” hver deres kundeliste kunne det give lidt mening at partitionere, men selv da ville det ikke være nødvendigt. Så i vores tænkte eksempel her starter vi med en kundetabel som ikke er partitioneret.
Den næste tabel er en video-tabel og her skal jeg for en god ordens skyld nævne at vi selvfølgelig ikke gemmer selve videoen i tabellen. Det er kun en reference til videoen. Alligevel kunne man godt forestille sig at videotabellen på tværs af alle kunder kunne vokse sig stor og over 10 GB. Men det er ikke den primære grund til at vi nok gerne vil partitionere video-tabellen.
Hver kunde betaler for sig og der er ikke umiddelbart planlagt at kunder skal dele videoer med hinanden. Tværtimod skal videoerne ligge sikkert, så her kan partitionering også hjælpe. Hvis vi partitionerer videoerne per kunde vil de ligge logisk separeret og en uopmærksom udvikler kan ikke ved et uheld komme til at lække videoer fra en kunde til en anden. Så vi har altså et kundefelt på videoerne og det udpeger vi som partitionsfelt.
Medarbejderne kan tilføje kommentarer til videoerne og dem skal vi også gemme. Måske skal kunder også kunne kommentere så der kan komme rigtig mange kommentarer. Måske overstiger det 10 GB for én kunde, så det er ikke nok at partitionere kommentarerne per kunde.
Men det er faktisk ikke den vigtigste grund til at vi skal partitionere kommentarerne. Den vigtigste grund er at kommentarer næsten altid tilgås under en video. Derfor er det vigtigt at de hurtigt og effektivt kan hentes når en video åbnes. Man kan godt søge på alle felter i Cosmos DB men det er ikke effektivt. Derfor skal man partitionere efter hvordan man tilgår data og her skal man nok partitionere efter både kunde og ID på videoen. Det kan du gøre ved at tilføje et felt på kommentarerne som hedde KundeOgVideoID hvor du så skal gemme begge dele hver gang du tilføjer en kommentar til databasen.
Men hvad så hvis du gerne vil finde de seneste 10 kommentarer på tværs af all videoer? Da du kun kan hente data for en partition ad gangen og du har partitioneret kommentarer for hver video, betyder det vel at du skal hente kommentarer for hver eneste video, måske tusindvis af gange, for at finde de seneste 10. Det er umuligt – betyder det at vi har partitioneret forkert? Nej, vi har partitioneret efter det primære brugsscenarie.
Der er flere muligheder for at understøtte sådan et scenarie og nogle vil nok foreslå at bruge Azure Search, men der findes også en rigtig god løsning uden du skal bruge et søgeprodukt. I stedet kan du bruge Cosmos BD Trigger til automatisk at kopiere alle dine data fra en container til en anden container? Men hvad hjælper det? Så har du bare en kopi af dine data. Jo, det er sådan at det er på containeren at man udpeger hvilket felt som skal bruges til partitionering, så ved at kopiere har du en mulighed for at partitionere dine data efter sekundære formål. Det kunne f.eks. være på dato hvis du let skal finde de seneste kommentarer på tværs af alle videoer.
Så her er de ting man skal overveje når man partitionerer. Kommer der til at være flere data end 10 GB? Er der brug for at data isoleres fra hinanden, f.eks. hvis de tilhører forskellige virksomheder? Og partitioneres data sådan som de oftest tilgås? Og husk du skal understøtte dit primære scenarie og så kan du kopiere data hvis du gerne vil understøtte sekundære scenarier.
Held og lykke med det og skriv gerne med spørgsmål og kommentarer på afsnittet på sociale medier. Du finder DotNyt på Facebook, Linkedin og Twitter.