Jeg ser en masse forvirring omkring pladsen og formålet med de mange nye databaseløsninger (“NoSQL-databaser”) sammenlignet med de relationelle databaseløsninger, der har eksisteret i mange år. Så lad mig forsøge at forklare forskellene og de bedste anvendelsesmuligheder for hver af dem.
Først skal vi afklare disse databaseløsninger i to grupper:
1) Relationelle databaser, som også kan kaldes relationelle databaseforvaltningssystemer (RDBMS) eller SQL-databaser. De mest populære af disse er Microsoft SQL Server, Oracle Database, MySQL og IBM DB2. Disse RDBMS’er bruges mest i store virksomhedsscenarier, med undtagelse af MySQL, som mest bruges til at lagre data til webapplikationer, typisk som en del af den populære LAMP-stack (Linux, Apache, MySQL, PHP/ Python/ Perl).
2) Ikke-relationelle databaser, også kaldet NoSQL-databaser, hvoraf de mest populære er MongoDB, DocumentDB, Cassandra, Coachbase, Coachbase, HBase, Redis og Neo4j. Disse databaser er normalt grupperet i fire kategorier: Key-value stores, Graph stores, Column stores og Document stores (se Typer af NoSQL-databaser).
Alle relationelle databaser kan bruges til at håndtere transaktionsorienterede applikationer (OLTP), og de fleste ikke-relationelle databaser, der er i kategorierne Document stores og Column stores, kan også bruges til OLTP, hvilket bidrager til forvirringen. OLTP-databaser kan opfattes som “operationelle” databaser, der er karakteriseret ved hyppige, korte transaktioner, der omfatter opdateringer, og som berører en lille datamængde, og hvor samtidighed af tusindvis af transaktioner er meget vigtig (eksempler, herunder bankapplikationer og online-reservationer). Dataintegritet er meget vigtig, så de understøtter ACID-transaktioner (Atomicity, Consistency, Isolation, Durability). Dette står i modsætning til datawarehouses, der betragtes som “analytiske” databaser, som er kendetegnet ved lange, komplekse forespørgsler, der berører en stor mængde data og kræver mange ressourcer. Opdateringer er sjældne. Et eksempel er analyse af salget det seneste år.
Relationelle databaser arbejder normalt med strukturerede data, mens ikke-relationelle databaser normalt arbejder med semistrukturerede data (dvs. XML, JSON).
Lad os se nærmere på hver gruppe:
Relationelle databaser
En relationel database er organiseret på baggrund af den relationelle datamodel, som blev foreslået af E.F. Codd i 1970. Denne model organiserer data i en eller flere tabeller (eller “relationer”) med rækker og kolonner med en unik nøgle for hver række. Generelt har hver enhedstype, der er beskrevet i en database, sin egen tabel med rækker, der repræsenterer instanser af den pågældende enhedstype, og kolonner, der repræsenterer de værdier, der er tildelt den pågældende instans. Da hver række i en tabel har sin egen entydige nøgle, kan rækker i en tabel forbindes med rækker i andre tabeller ved at lagre den entydige nøgle for den række, som den skal forbindes med (hvor en sådan entydig nøgle kaldes en “fremmed nøgle”). Codd viste, at datarelationer af vilkårlig kompleksitet kan repræsenteres ved hjælp af dette enkle sæt af begreber.
Næsten alle relationelle databasesystemer anvender SQL (Structured Query Language) som sprog til forespørgsler og vedligeholdelse af databasen.
Grundene til de relationelle databasers dominans er: enkelhed, robusthed, fleksibilitet, ydeevne, skalerbarhed og kompatibilitet ved håndtering af generiske data.
Men for at kunne tilbyde alt dette skal relationelle databaser være utroligt komplekse internt. F.eks. kan en forholdsvis simpel SELECT-anvisning have dusinvis af potentielle udførelsesveje for forespørgsler, som en forespørgselsoptimering vil evaluere på køretid. Alt dette er skjult for brugerne, men under motorhjelmen bestemmer RDBMS’et den bedste “udførelsesplan” til at besvare forespørgsler ved hjælp af f.eks. omkostningsbaserede algoritmer.
For store databaser, især dem, der anvendes til webapplikationer, er det vigtigste problem skalerbarhed. Efterhånden som flere og flere applikationer oprettes i miljøer, der har massive arbejdsbelastninger (f.eks. Amazon), kan deres krav til skalerbarhed ændre sig meget hurtigt og vokse sig meget store. Relationelle databaser skalerer godt, men normalt kun når denne skalering sker på en enkelt server (“scale-up”). Når kapaciteten på den enkelte server er nået, er man nødt til at “scale-out” og fordele belastningen på flere servere og dermed gå over til såkaldt distribueret databehandling. Det er her, at kompleksiteten af relationelle databaser begynder at skabe problemer med deres muligheder for at skalere. Hvis man forsøger at skalere til hundredvis eller tusindvis af servere, bliver kompleksiteten overvældende. De egenskaber, der gør relationelle databaser så tiltalende, er de samme, der også drastisk reducerer deres levedygtighed som platforme for store distribuerede systemer.
Non-relationelle databaser
En NoSQL-database giver en mekanisme til lagring og hentning af data, der er modelleret på andre måder end de tabelrelationer, der anvendes i relationelle databaser.
Motivationerne for denne tilgang omfatter:
- Enkelhed i designet. Man behøver ikke at beskæftige sig med “impedansforskellen” mellem den objektorienterede tilgang til at skrive applikationer og de skemabaserede tabeller og rækker i en relationel database. F.eks. at gemme alle kundeordreoplysninger i ét dokument i stedet for at skulle sammenføje mange tabeller, hvilket resulterer i mindre kode at skrive, fejlfinde og vedligeholde
- Bedre “horisontal” skalering til klynger af maskiner, hvilket løser problemet, når antallet af samtidige brugere stiger voldsomt for applikationer, der er tilgængelige via internettet og mobile enheder. Brug af dokumenter gør det meget lettere at skalere ud, da alle oplysninger om den pågældende kundeordre er samlet ét sted i stedet for at være spredt ud på flere tabeller. NoSQL-databaser spreder automatisk data på tværs af servere uden at kræve applikationsændringer (auto-sharding), hvilket betyder, at de nativt og automatisk spreder data på et vilkårligt antal servere, uden at applikationen overhovedet behøver at være opmærksom på sammensætningen af serverpuljen. Data og forespørgselsbelastning balanceres automatisk på tværs af servere, og når en server går ned, kan den hurtigt og gennemsigtigt udskiftes uden afbrydelse af applikationen
- Finere kontrol over tilgængelighed. Servere kan tilføjes eller fjernes uden nedetid for programmet. De fleste NoSQL-databaser understøtter datareplikering, hvor der lagres flere kopier af data på tværs af klyngen eller endda på tværs af datacentre for at sikre høj tilgængelighed og katastrofeberedskab
- For nemt at indfange alle former for data “Big Data”, som omfatter ustrukturerede og semi-strukturerede data. Giver mulighed for en fleksibel database, der nemt og hurtigt kan rumme alle nye datatyper, og som ikke forstyrres af ændringer i indholdsstrukturen. Dette skyldes, at dokumentdatabaser er skemaløse, hvilket gør det muligt frit at tilføje felter til JSON-dokumenter uden først at skulle definere ændringer (schema-on-read i stedet for schema-on-write). Du kan have dokumenter med et andet antal felter end andre dokumenter. F.eks. en patientjournal, der kan eller ikke kan indeholde felter, der opregner allergier
- Hastighed. De datastrukturer, der anvendes af NoSQL-databaser (dvs. JSON-dokumenter), adskiller sig fra dem, der som standard anvendes i relationelle databaser, hvilket gør mange operationer hurtigere i NoSQL end i relationelle databaser, fordi man ikke behøver at sammenføje tabeller (på bekostning af øget lagerplads på grund af duplikering af data – men lagerplads er så billig i dag, at dette normalt ikke er et problem). Faktisk understøtter de fleste NoSQL-databaser slet ikke joins
- Omkostninger. NoSQL-databaser bruger normalt klynger af billige råvareservere, mens RDBMS har en tendens til at være afhængige af dyre proprietære servere og lagringssystemer. Desuden kan licenserne til RDBMS-systemer være ret dyre, mens mange NoSQL-databaser er open source og derfor gratis
Den særlige egnethed af en given NoSQL-database afhænger af det problem, den skal løse.
NoSQL-databaser anvendes i stigende grad i big data- og realtidswebapplikationer. De blev populære med indførelsen af internettet, da databaser gik fra et maksimum på et par hundrede brugere på en intern virksomhedsapplikation til tusindvis eller millioner af brugere på en webapplikation. NoSQL-systemer kaldes også “Not only SQL” for at understrege, at de også kan understøtte SQL-lignende forespørgselssprog.
Mange NoSQL-lagre går på kompromis med konsistensen (i betydningen af CAP-teoremet) til fordel for tilgængelighed og partitionstolerance. Nogle af de grunde, der blokerer for indførelse af NoSQL-lagre, er bl.a. brugen af forespørgselssprog på lavt niveau, manglen på standardiserede grænseflader og store investeringer i eksisterende SQL. Desuden mangler de fleste NoSQL-lagre ægte ACID-transaktioner eller understøtter kun transaktioner under visse omstændigheder og på visse niveauer (f.eks. dokumentniveau). Endelig er RDBMS’er normalt meget enklere at bruge, da de har GUI’er, hvor mange NoSQL-løsninger bruger en kommandolinje-interface.
Sammenligning af de to
En af de alvorligste begrænsninger i relationelle databaser er, at hvert element kun kan indeholde én attribut. Hvis vi bruger et eksempel med en bank, er hvert aspekt af en kundes forhold til en bank gemt som separate rækkeposter i separate tabeller. Så kundens stamoplysninger er i én tabel, kontooplysningerne er i en anden tabel, låneoplysningerne i endnu en tabel, investeringer i en anden tabel osv. Alle disse tabeller er forbundet med hinanden ved hjælp af relationer såsom primærnøgler og fremmednøgler.
Non-relationelle databaser, nærmere bestemt en databases nøgle-værdi-lagre eller nøgle-værdipar, er radikalt forskellige fra denne model. Nøgle-værdipar giver mulighed for at gemme flere relaterede elementer i én “række” data i den samme tabel. Vi sætter ordet “række” i anførselstegn, fordi en række her ikke rigtig er det samme som en række i en relationel tabel. I en ikke-relationel tabel for den samme bank ville hver række f.eks. indeholde kundens oplysninger samt oplysninger om konto, lån og investering. Alle data vedrørende en kunde ville bekvemt blive gemt sammen som én post.
Dette synes at være en åbenlyst overlegen metode til lagring af data, men den har en stor ulempe: nøgle-værdi lagre kan i modsætning til relationelle databaser ikke håndhæve relationer mellem dataelementer. I vores nøgleværdidatabase ville f.eks. kundeoplysningerne (navn, socialsikringsoplysninger, adresse, kontonummer, lånebehandlingsnummer osv.) alle blive gemt som én datapost (i stedet for at blive gemt i flere tabeller, som i den relationelle model). ) ville også blive lagret som en anden enkelt datapost.
I den relationelle model er der en indbygget og idiotsikker metode til at sikre og håndhæve forretningslogik og regler i databaselaget, f.eks. at en udbetaling bliver debiteret den rigtige bankkonto, gennem primærnøgler og fremmednøgler. I key-value stores falder dette ansvar helt og holdent på applikationslogikken, og mange mennesker er meget utilpas ved at overlade dette afgørende ansvar til applikationen alene. Dette er en af grundene til, at relationelle databaser fortsat vil blive anvendt.
Men når det drejer sig om webbaserede applikationer, der anvender databaser, er aspektet med streng håndhævelse af forretningslogik ofte ikke en topprioritet. Den højeste prioritet er evnen til at betjene et stort antal brugerforespørgsler, som typisk er skrivebeskyttede forespørgsler. På et websted som f.eks. eBay er det f.eks. sådan, at størstedelen af brugerne blot gennemser og kigger på de indsendte varer (skrivebeskyttede operationer). Kun en brøkdel af disse brugere afgiver faktisk bud eller reserverer varer (skrive- og læseoperationer). Og husk, at vi taler om millioner, nogle gange milliarder, af sidevisninger om dagen. eBay-webstedets administratorer er mere interesserede i hurtig responstid for at sikre hurtigere indlæsning af siderne for webstedets brugere end i de traditionelle prioriteter om at håndhæve forretningsregler eller sikre en balance mellem læsninger og skrivninger.
Databaser med relationelle modeller kan tilpasses og opsættes til at køre store læseoperationer gennem datawarehousing og dermed potentielt betjene en stor mængde brugere, der forespørger på en stor mængde data, især når der anvendes relationelle MPP-arkitekturer som Analytics Platform System, Teradata, Oracle Exadata eller IBM Netezza, som alle understøtter skalering. Som tidligere nævnt adskiller datawarehouses sig fra typiske databaser ved at blive brugt til mere komplekse analyser af data. Dette adskiller sig fra den transaktionelle (OLTP) database, hvis hovedanvendelse er at understøtte operationelle systemer og tilbyde dagligdags rapportering i mindre skala.
Den virkelige udfordring er imidlertid den relationelle models manglende skalerbarhed, når der er tale om OLTP-applikationer eller enhver løsning med mange individuelle skrivninger, hvilket er domænet for relationelle SMP-arkitekturer. Det er her, at ikke-relationelle modeller virkelig kan brillere. De kan nemt fordele deres datalast på snesevis, hundreder og i ekstreme tilfælde (tænk på Google-søgning) endda tusindvis af servere. Da hver server kun håndterer en lille procentdel af de samlede forespørgsler fra brugerne, er svartiden meget god for hver enkelt bruger. Selv om denne distribuerede datamodel kan opbygges til relationelle databaser, er den virkelig besværlig at implementere, især når der er mange skrivninger (dvs. OLTP), hvilket kræver teknikker som sharding, som normalt kræver en betydelig kodning uden for applikationens forretningslogik. Dette skyldes, at den relationelle model insisterer på dataintegritet på alle niveauer, som skal opretholdes, selv når dataene tilgås og ændres af flere forskellige servere. Dette er grunden til, at den ikke-relationelle model er den foretrukne arkitektur til webapplikationer som cloud-computing og sociale netværk.
Så sammenfattende lider RDBMS’er af manglende horisontal skalering til høje transaktionsbelastninger (millioner af læseskrivere), mens NoSQL-databaser løser høje transaktionsbelastninger, men på bekostning af dataintegritet og joins.
Husk på, at mange løsninger vil bruge en kombination af relationelle og ikke-relationelle databaser (se Hvad er polyglot persistens?).
Hold også i tankerne, at du måske ikke har brug for ydelsen fra en ikke-relationel database, og at det i stedet vil være nok bare at gå med at lagre filer i HDFS og bruge Apache Hive (Apache Hive er en datawarehouse-infrastruktur, der er bygget oven på Hadoop med henblik på at levere datasammenfatning, forespørgsler og analyse, som den leverer via et SQL-lignende sprog kaldet HiveQL).
Og for at slutte af med en bemærkning, der bidrager til forvirringen, har vi en anden kategori, der danner en ny kategori kaldet NewSQL: NewSQL er en klasse af moderne RDBMS’er, der søger at give den samme skalerbare ydeevne som NoSQL-systemer til OLTP-læse-skrive-arbejdsbelastninger, samtidig med at de stadig opretholder ACID-garantierne fra et traditionelt relationelt databasesystem. Ulemperne er, at de ikke er til forespørgsler i OLAP-stil, og at de er uegnede til databaser på over et par terabyte. Som eksempler kan nævnes VoltDB, NuoDB, MemSQL, SAP HANA, Splice Machine, Clustrix og Altibase.
Et billede, der viser de kategorier, som mange af produkterne passer ind i:
En fremragende grafik, der viser, hvordan alle teknologierne passer ind i Azure-skyen, er fra Understanding NoSQL on Microsoft Azure:
Den vigtigste grund til at bruge en NoSQL-løsning er, hvis du har en OLTP-applikation, der har tusindvis af brugere og har en meget stor database, der kræver en scale-out-løsning og/eller bruger JSON-data, især hvis disse JSON-data har forskellige strukturer. Du får også fordelene ved høj tilgængelighed, da NoSQL-løsninger lagrer flere kopier af dataene. Du skal blot huske på, at du for ydelsens skyld kan ofre datakonsistens samt muligheden for at sammenføje data, bruge SQL og foretage hurtige masseopdateringer.
Mere info:
MySQL vs MongoDB
MySQL vs MongoDB
MySQL vs. MongoDB: Kigger på relationelle og ikke-relationelle databaser
10 ting du bør vide om NoSQL-databaser
Indledning til databaser
Forskellen mellem SQL og NoSQL : Sammenligning
SQL vs NoSQL Database Forskelle Forklaret med få Eksempel DB
NoSQL, NewSQL, eller RDBMS: Hvordan man vælger
NewSQL – RDBMS on Steroids
NoSQL vs NewSQL Databaser Vælg det rigtige værktøj til den rigtige opgave
SQL vs NoSQL: du ønsker at have et relationelt lager som standard
Oracle forsvarer relationelle DB’er mod NoSQL-konkurrenter
Forståelse af NoSQL på Microsoft Azure
Mød avantgarden af nye relationelle databaser
Til SQL eller NoSQL? Det er databasespørgsmålet
CAP Theorem: Revisited
Hvad er virkelig nyt med NewSQL?
MongoDB vs. MySQL: En sammenlignende undersøgelse af databaser
SQL- og NoSQL-databasefunktioner og -forskelle