Jag ser en hel del förvirring om platsen och syftet med de många nya databaslösningarna (”NoSQL-databaser”) jämfört med de relationella databaslösningar som har funnits i många år. Så låt mig försöka förklara skillnaderna och de bästa användningsområdena för var och en av dem.
Först ska vi klargöra dessa databaslösningar i två grupper:
1) Relationella databaser, som också kan kallas relationella databashanteringssystem (RDBMS) eller SQL-databaser. De mest populära av dessa är Microsoft SQL Server, Oracle Database, MySQL och IBM DB2. Dessa RDBMS används främst i stora företagsscenarier, med undantag för MySQL, som främst används för att lagra data för webbapplikationer, vanligtvis som en del av den populära LAMP-stacken (Linux, Apache, MySQL, PHP/Python/Perl).
2) Icke-relationella databaser, även kallade NoSQL-databaser, de mest populära är MongoDB, DocumentDB, Cassandra, Coachbase, HBase, Redis och Neo4j. Dessa databaser brukar delas in i fyra kategorier: Alla relationsdatabaser kan användas för att hantera transaktionsorienterade tillämpningar (OLTP), och de flesta icke-relationella databaser som tillhör kategorierna Document stores och Column stores kan också användas för OLTP, vilket bidrar till förvirringen. OLTP-databaser kan betraktas som ”operativa” databaser, som kännetecknas av frekventa, korta transaktioner som inkluderar uppdateringar och som rör en liten mängd data och där samtidighet av tusentals transaktioner är mycket viktigt (exempel: bankapplikationer och onlinebokningar). Uppgifternas integritet är mycket viktig, så de stöder ACID-transaktioner (Atomicity, Consistency, Isolation, Durability). Detta står i motsats till datalager, som anses vara ”analytiska” databaser som kännetecknas av långa, komplexa frågor som rör en stor mängd data och kräver mycket resurser. Uppdateringarna är sällsynta. Ett exempel är analys av försäljningen under det senaste året.
Relationella databaser arbetar vanligtvis med strukturerade data, medan icke-relationella databaser vanligtvis arbetar med semistrukturerade data (t.ex. XML, JSON).
Låt oss titta närmare på varje grupp:
Relationella databaser
En relationsdatabas organiseras utifrån den relationella datamodellen, som föreslogs av E.F. Codd 1970. Denna modell organiserar data i en eller flera tabeller (eller ”relationer”) med rader och kolumner, med en unik nyckel för varje rad. I allmänhet har varje typ av enhet som beskrivs i en databas en egen tabell där raderna representerar instanser av den typen av enhet och kolumnerna representerar värden som tilldelats den instansen. Eftersom varje rad i en tabell har sin egen unika nyckel kan rader i en tabell länkas till rader i andra tabeller genom att lagra den unika nyckeln för den rad som den ska länkas till (där en sådan unik nyckel kallas en ”främmande nyckel”). Codd visade att datarelationer av godtycklig komplexitet kan representeras med hjälp av denna enkla uppsättning begrepp.
Nästan alla relationella databassystem använder SQL (Structured Query Language) som språk för att ställa frågor till och underhålla databasen.
Skälen till att relationella databaser är så dominerande är: enkelhet, robusthet, flexibilitet, prestanda, skalbarhet och kompatibilitet när det gäller hantering av generiska data.
Men för att kunna erbjuda allt detta måste relationella databaser vara otroligt komplexa internt. Ett relativt enkelt SELECT-uttalande kan till exempel ha dussintals potentiella sökvägar, som en sökoptimerare utvärderar vid körning. Allt detta är dolt för användarna, men under huven avgör RDBMS den bästa ”exekveringsplanen” för att besvara förfrågningar med hjälp av t.ex. kostnadsbaserade algoritmer.
För stora databaser, särskilt sådana som används för webbapplikationer, är skalbarheten det viktigaste problemet. Eftersom fler och fler tillämpningar skapas i miljöer som har massiva arbetsbelastningar (t.ex. Amazon) kan deras skalbarhetskrav ändras mycket snabbt och bli mycket stora. Relationella databaser skalar bra, men vanligtvis bara när skalningen sker på en enda server (”scale-up”). När kapaciteten på den enskilda servern är uppnådd måste man ”skala ut” och fördela belastningen på flera servrar, vilket innebär att man övergår till så kallad distribuerad databehandling. Det är då komplexiteten hos relationsdatabaser börjar orsaka problem med deras skalbarhet. Om man försöker skala upp till hundratals eller tusentals servrar blir komplexiteten överväldigande. De egenskaper som gör relationsdatabaser så tilltalande är de samma som också drastiskt minskar deras livskraft som plattformar för stora distribuerade system.
Non-relationella databaser
En NoSQL-databas tillhandahåller en mekanism för lagring och hämtning av data som är modellerad på andra sätt än de tabellerelationer som används i relationsdatabaser.
Motivationerna för detta tillvägagångssätt är bland annat:
- Enkelhet i utformningen. Att inte behöva hantera ”impedansmissen” mellan det objektorienterade tillvägagångssättet för att skriva program och de schemabaserade tabellerna och raderna i en relationsdatabas. Till exempel att lagra all information om kundernas beställningar i ett dokument i stället för att behöva sammanfoga många tabeller, vilket resulterar i mindre kod att skriva, felsöka och underhålla
- Bättre ”horisontell” skalning till kluster av maskiner, vilket löser problemet när antalet samtidiga användare skjuter i höjden för tillämpningar som är tillgängliga via webben och mobila enheter. Användning av dokument gör det mycket lättare att skala ut eftersom all information om kundbeställningen finns på ett ställe i stället för att spridas ut på flera tabeller. NoSQL-databaser sprider automatiskt data mellan servrar utan att kräva ändringar i programmet (auto-sharding), vilket innebär att de naturligt och automatiskt sprider data mellan ett godtyckligt antal servrar, utan att programmet ens behöver vara medvetet om sammansättningen av serverpoolen. Data- och frågelast balanseras automatiskt mellan servrarna, och när en server går ner kan den snabbt och transparent bytas ut utan att programmet störs
- Finare kontroll över tillgängligheten. Servrar kan läggas till eller tas bort utan att applikationen behöver stoppas. De flesta NoSQL-databaser har stöd för datareplikering, vilket innebär att flera kopior av data lagras i klustret eller till och med i olika datacenter, för att säkerställa hög tillgänglighet och katastrofåterställning
- För att enkelt kunna fånga in alla typer av data ”Big Data” som inkluderar ostrukturerade och halvstrukturerade data. Att möjliggöra en flexibel databas som lätt och snabbt kan ta emot alla nya typer av data och som inte störs av ändringar i innehållsstrukturen. Detta beror på att dokumentdatabaser är schemalösa, vilket gör att du fritt kan lägga till fält i JSON-dokument utan att först behöva definiera ändringar (schema-on-read istället för schema-on-write). Du kan ha dokument med ett annat antal fält än andra dokument. Till exempel en patientjournal som kan eller inte kan innehålla fält som listar allergier
- Speed. De datastrukturer som används av NoSQL-databaser (dvs. JSON-dokument) skiljer sig från dem som används som standard i relationsdatabaser, vilket gör många operationer snabbare i NoSQL än i relationsdatabaser på grund av att man inte behöver sammanfoga tabeller (på bekostnad av ökat lagringsutrymme på grund av dubblering av data – men lagringsutrymme är så billigt nuförtiden att detta vanligtvis inte är ett problem). Faktum är att de flesta NoSQL-databaser inte ens har stöd för sammanfogningar
- Kostnad. NoSQL-databaser använder vanligtvis kluster av billiga servrar, medan RDBMS tenderar att förlita sig på dyra proprietära servrar och lagringssystem. Dessutom kan licenserna för RDBMS-system vara ganska dyra medan många NoSQL-databaser har öppen källkod och därför är gratis
Den särskilda lämpligheten hos en viss NoSQL-databas beror på det problem som den ska lösa.
NoSQL-databaser används i allt större utsträckning i webbtillämpningar med stora datamängder och i realtid. De blev populära i samband med införandet av webben, då databaser gick från max några hundra användare i en intern företagsapplikation till tusentals eller miljoner användare i en webbapplikation. NoSQL-system kallas också ”Not only SQL” för att betona att de också kan stödja SQL-liknande frågespråk.
Många NoSQL-butiker kompromissar med konsistens (i betydelsen CAP-satsen) till förmån för tillgänglighet och partitionstolerans. Några skäl som blockerar införandet av NoSQL-butiker är användningen av frågespråk på låg nivå, bristen på standardiserade gränssnitt och enorma investeringar i befintlig SQL. De flesta NoSQL-butiker saknar också äkta ACID-transaktioner eller stöder endast transaktioner under vissa omständigheter och på vissa nivåer (t.ex. dokumentnivå). Slutligen är RDBMS vanligtvis mycket enklare att använda eftersom de har grafiska gränssnitt där många NoSQL-lösningar använder ett kommandoradsgränssnitt.
Vid jämförelse
En av de allvarligaste begränsningarna för relationsdatabaser är att varje objekt endast kan innehålla ett attribut. Om vi använder ett exempel med en bank lagras varje aspekt av en kunds förhållande till en bank som separata radposter i separata tabeller. Så kundens huvuduppgifter finns i en tabell, kontouppgifterna i en annan tabell, låneuppgifterna i en annan, investeringarna i en annan tabell och så vidare. Alla dessa tabeller är kopplade till varandra med hjälp av relationer som primärnycklar och främmande nycklar.
Non-relationella databaser, närmare bestämt en databas nyckelvärdeslager eller nyckelvärdespar, skiljer sig radikalt från denna modell. Nyckelvärdepar gör det möjligt att lagra flera relaterade objekt i en ”rad” av data i samma tabell. Vi sätter ordet ”rad” inom citationstecken eftersom en rad här egentligen inte är samma sak som en rad i en relationell tabell. I en icke-relationell tabell för samma bank skulle till exempel varje rad innehålla kundens uppgifter samt uppgifter om konto, lån och investeringar. Alla uppgifter om en kund skulle lämpligen lagras tillsammans som en post.
Detta verkar vara en uppenbart överlägsen metod för att lagra uppgifter, men den har en stor nackdel: nyckelvärdeslagren kan, till skillnad från relationsdatabaser, inte upprätthålla relationer mellan dataelement. I vår nyckelvärdesdatabas skulle till exempel kunduppgifterna (namn, personnummer, adress, kontonummer, lånehandläggningsnummer etc.) lagras som en enda datapost (i stället för att lagras i flera tabeller, som i den relationella modellen). ) skulle också lagras som en annan enda datapost.
I relationsmodellen finns det en inbyggd och idiotsäker metod för att säkerställa och genomdriva affärslogik och regler i databasskiktet, t.ex. att ett uttag debiteras rätt bankkonto, genom primärnycklar och främmande nycklar. I nyckelvärdeslagren faller detta ansvar helt och hållet på applikationslogiken och många människor känner sig mycket obekväma med att lämna detta viktiga ansvar enbart till applikationen. Detta är en av anledningarna till att relationella databaser kommer att fortsätta att användas.
När det gäller webbaserade tillämpningar som använder databaser är emellertid aspekten att strikt upprätthålla affärslogik ofta inte en av de viktigaste prioriteringarna. Den högsta prioriteringen är förmågan att betjäna ett stort antal användarförfrågningar, som vanligtvis är skrivskyddade förfrågningar. På en webbplats som eBay till exempel, bläddrar majoriteten av användarna helt enkelt och tittar på de objekt som lagts ut (skrivskyddade operationer). Endast en bråkdel av dessa användare lägger faktiskt bud eller reserverar föremålen (läs- och skrivoperationer). Och kom ihåg att det handlar om miljontals, ibland miljarder, sidvisningar per dag. Administratörerna på eBay-webbplatsen är mer intresserade av snabb svarstid för att se till att sidorna laddas snabbare för webbplatsens användare, än av de traditionella prioriteringarna att upprätthålla affärsregler eller se till att det finns en balans mellan läs- och skrivningar.
Databaser med relationell modell kan anpassas och ställas in för att köra storskaliga skrivskyddade operationer genom datalagring och därmed potentiellt betjäna en stor mängd användare som frågar efter en stor mängd data, särskilt när man använder relationella MPP-arkitekturer som Analytics Platform System, Teradata, Oracle Exadata eller IBM Netezza, som alla har stöd för skalning. Som tidigare nämnts skiljer sig datalager från vanliga databaser genom att de används för mer komplexa analyser av data. Detta skiljer sig från transaktionsdatabaser (OLTP-databaser), vars huvudsakliga användning är att stödja operativa system och erbjuda daglig, småskalig rapportering.
Den verkliga utmaningen är dock den relationella modellens bristande skalbarhet när det gäller OLTP-tillämpningar, eller någon lösning med många enskilda skrivningar, vilket är domänen för relationella SMP-arkitekturer. Det är här som icke-relationella modeller verkligen kan briljera. De kan enkelt fördela sina datalaster över dussintals, hundratals och i extrema fall (tänk Google-sökning) till och med tusentals servrar. Eftersom varje server endast hanterar en liten andel av de totala förfrågningarna från användarna är svarstiden mycket god för varje enskild användare. Även om denna distribuerade datormodell kan byggas för relationsdatabaser är den mycket svår att genomföra, särskilt när det är många skrivningar (dvs. OLTP), vilket kräver tekniker som sharding som vanligtvis kräver betydande kodning utanför applikationens affärslogik. Detta beror på att den relationella modellen kräver dataintegritet på alla nivåer, som måste upprätthållas även när uppgifterna nås och ändras av flera olika servrar. Detta är anledningen till att den icke-relationella modellen är den arkitektur som väljs för webbapplikationer som cloud-computing och sociala nätverk.
Så sammanfattningsvis lider RDBMS av att de inte har någon horisontell skalning för hög transaktionsbelastning (miljontals läs- och skrivningar), medan NoSQL-databaser löser höga transaktionsbelastningar, men på bekostnad av dataintegritet och joins.
Håll i åtanke att många lösningar kommer att använda en kombination av relationella och icke-relationella databaser (se Vad är polyglott persistens?).
Håll också i åtanke att du kanske inte behöver prestandan hos en icke-relationell databas och att det i stället räcker med att lagra filer i HDFS och använda Apache Hive (Apache Hive är en infrastruktur för datalager som är byggd ovanpå Hadoop för att tillhandahålla sammanfattning, sökning och analys av data, vilket sker med hjälp av ett SQL-liknande språk som kallas HiveQL).
Och för att avsluta med en anmärkning som ökar förvirringen, har vi ytterligare en kategori som kallas NewSQL: NewSQL är en klass av moderna RDBMS som försöker ge samma skalbara prestanda som NoSQL-system för OLTP-arbetsbelastningar med läs- och skrivuppgifter, samtidigt som de behåller ACID-garantierna i ett traditionellt relationellt databassystem. Nackdelarna är att de inte lämpar sig för förfrågningar i OLAP-stil och att de är olämpliga för databaser över några terabyte. Exempel är VoltDB, NuoDB, MemSQL, SAP HANA, Splice Machine, Clustrix och Altibase.
En bild som visar de kategorier som många av produkterna passar in i:
En utmärkt grafik som visar hur alla tekniker passar in i Azure-molnet är från Understanding NoSQL on Microsoft Azure:
Den viktigaste faktorn för att använda en NoSQL-lösning är om du har en OLTP-applikation med tusentals användare och en mycket stor databas som kräver en scale-out-lösning och/eller använder JSON-data, särskilt om dessa JSON-data har olika strukturer. Du får också fördelarna med hög tillgänglighet eftersom NoSQL-lösningar lagrar flera kopior av data. Tänk bara på att du för prestanda kan offra datakonsistens, liksom möjligheten att sammanfoga data, använda SQL och göra snabba massuppdateringar.
Mer info:
MySQL vs MongoDB
MySQL vs MongoDB
MySQL vs MongoDB. MongoDB: Att titta på relationella och icke-relationella databaser
10 saker du bör veta om NoSQL-databaser
Introduktion till databaser
Skillnaden mellan SQL och NoSQL: Jämförelse
SQL vs NoSQL-databasens skillnader förklaras med några få exempel DB
NoSQL, NewSQL, eller RDBMS: Hur man väljer
NewSQL – RDBMS on Steroids
NoSQL vs NewSQL Databaser Välj rätt verktyg för rätt jobb
SQL vs NoSQL: Du vill ha en relationell lagring som standard
Oracle försvarar relationella databaser mot NoSQL-konkurrenter
Understanding NoSQL on Microsoft Azure
Möt avantgardet av nya relationella databaser
Till SQL eller NoSQL? Det är databasfrågan
CAP Theorem: Revisited
Vad är egentligen nytt med NewSQL?
MongoDB vs MySQL: En jämförande studie av databaser
Funktioner och skillnader mellan SQL- och NoSQL-databaser