<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>database &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/database/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 12:23:30 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>database &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>NewSQL: Getest en Goedgekeurd</title>
		<link>https://www.smalsresearch.be/newsql-getest-en-goedgekeurd/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 15 Sep 2020 08:22:50 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[NewSQL]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=13705</guid>

					<description><![CDATA[Vorige herfst schreven we onze eerste blog over de veelbelovende technologie NewSQL. Na een pauze en een periode met enkele testen, kunnen we nu bevestigen dat deze nieuwe databases effectief een positieve evolutie zijn. Evolutie, geen Revolutie Wat het database gebruik in de IT sector betreft, zien we nog steeds een ruime meerderheid voor traditionele [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-large is-resized"><img decoding="async" src="/wp-content/uploads/2020/04/logo2-approved-transp.png" alt="" class="wp-image-14484" width="127" height="127"/></figure></div>



<p class="justify-text">Vorige herfst schreven we onze <a href="/newsql-een-upgrade-voor-je-oude-database/" data-type="post" data-id="13610">eerste blog</a> over de veelbelovende technologie NewSQL. Na een pauze en een periode met enkele testen, kunnen we nu bevestigen dat deze nieuwe databases effectief een positieve evolutie zijn.</p>



<h2 class="wp-block-heading">Evolutie, geen Revolutie</h2>



<p class="justify-text">Wat het <a href="https://scalegrid.io/blog/2019-database-trends-sql-vs-nosql-top-databases-single-vs-multiple-database-use/">database gebruik</a> in de IT sector betreft, zien we nog steeds een ruime meerderheid voor traditionele databases. Leidende spelers zijn daarbij <a href="https://www.mysql.com/" data-type="URL" data-id="https://www.mysql.com/">MySQL</a> en <a href="https://www.postgresql.org/" data-type="URL" data-id="https://www.postgresql.org/">PostgreSQL</a>. Daarnaast weet ook de NoSQL database <a href="https://www.mongodb.com/" data-type="URL" data-id="https://www.mongodb.com/">MongoDB</a> aardig wat marktaandeel te veroveren. Van een revolutionaire opmars van NewSQL databases kan dus nog geen sprake zijn.</p>



<p class="justify-text">De reeds bestaande databases, zowel OldSQL als NoSQL, staan dan ook niet stil in hun evolutie, en groeien op verschillende vlakken naar elkaar toe. Enkele NoSQL producten bieden b.v. een beperkte ondersteuning voor SQL of SQL-achtige talen aan, en soms ook transacties. De traditionele relationele databases, op hun beurt, bieden allerlei manieren aan om horizontaal te gaan schalen en dus een <a href="https://www.howtoforge.com/tutorial/how-to-set-up-master-slave-replication-for-postgresql-96-on-ubuntu-1604/" data-type="URL" data-id="https://www.howtoforge.com/tutorial/how-to-set-up-master-slave-replication-for-postgresql-96-on-ubuntu-1604/">gedistribueerd systeem</a> op te zetten met een verhoogde beschikbaarheid. Men kan dus stellen dat de verschillende categorieën van databases dichter naar elkaar toegroeien.</p>



<p class="justify-text">Ook NewSQL kan men, zoals we reeds aanhaalden in de vorige blog, eigenlijk beschouwen als een soort naar elkaar toegroeien van beide andere categorieën. Zit er dan nog een effectieve vernieuwing in?</p>



<p class="justify-text">Het antwoord op die vraag situeert zich in een aantal producten die van nul af zijn opgebouwd met de problematiek van dit spanningsveld tussen consistentie en <a href="/high-availability-wc-papier/" data-type="post" data-id="1368">beschikbaarheid</a> in gedachten, en die met een <a href="https://en.wikipedia.org/wiki/Cloud_native_computing" data-type="URL" data-id="https://en.wikipedia.org/wiki/Cloud_native_computing">cloud native</a> aanpak zijn ontworpen. Dit wil o.a. zeggen dat dit vanaf het begin een gedistribueerd ontwerp betreft. De basis architectuur en de opzet zijn aldus voldoende verschillend van de andere producten om er effectief het label &#8220;NewSQL&#8221; aan te hangen. Het resultaat zijn systemen die de gewenste eigenschappen combineren, zonder dat de installatie en het onderhoud nodeloos complex worden.</p>



<p class="justify-text">Om te zien hoe dit spanningsveld precies wordt aangepakt bij NewSQL, moeten we nog eens terugkomen op het befaamde CAP-theorema&#8230;</p>



<h2 class="wp-block-heading">Van CAP naar PACELC</h2>



<p class="justify-text">Het <a href="https://en.wikipedia.org/wiki/CAP_theorem" data-type="URL" data-id="https://en.wikipedia.org/wiki/CAP_theorem">Cap theorema</a> gaat vooral in op wat theoretisch niét kan (C, A én P tegelijk hebben). Het vertelt ons echter iets te weinig over wat men dan wel kan doen binnen de grenzen van wat theoretisch mogelijk is.</p>



<p class="justify-text">Wanneer alles redelijk normaal verloopt voor een gedistribueerd systeem, treden er geen netwerkpartities op. Op dat ogenblik kan men dus, in principe, volgens het CAP theorema, zorgen voor beschikbaarheid en consistentie tegelijkertijd. In de praktijk zal dit, indien alles naar wens verloopt en er geen al te zware load op het platform inwerkt, ook zo zijn. Zelfs de &#8220;eventual&#8221; consistency van NoSQL systemen zal dan slechts seconden zijn i.p.v. de langere tijd die men van &#8220;eventual&#8221; zou verwachten.</p>



<p class="justify-text">Nochtans moet men in dit geval ook nog keuzes maken&#8230; Het PACELC theorema, een uitbreiding op het CAP theorema, stelt namelijk dat men in afwezigheid van netwerkpartities, moet kiezen tussen <em>latency</em> en <em>consistentie</em>. NoSQL trekt hier duidelijk de kaart van latency: men aanvaardt onmiddellijk een request van een client, en rekent op de eventual consistency om alle nodes van het systeem op een redelijke tijd in orde te krijgen. NewSQL systemen daarentegen, kiezen consistentie: vooraleer de request wordt aanvaard, zorgt men ervoor dat <a href="https://en.wikipedia.org/wiki/Quorum_(distributed_computing)" data-type="URL" data-id="https://en.wikipedia.org/wiki/Quorum_(distributed_computing)">voldoende nodes akkoord zijn</a> en wanneer de request aanvaard is, zal dit ook zo zijn op de meeste nodes, zodat de consistentie gegarandeerd is over het gehele systeem. Deze fase van &#8220;akkoord bereiken&#8221; tussen de nodes zal de werking natuurlijk enigszins vertragen.</p>



<div style="width: 400px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 3px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #fffd24; font-size: 0.8em; font-family: verdana;">
<p style="margin-bottom: 0.625em;"><strong><em>Consistency in CAP vs ACID</em></strong></p>
<p style="text-align: justify; margin-bottom: 0.625em;">
</p><p style="text-align: justify; margin-bottom: 0.625em;">In de vorige blog kon je een iets langere uitleg lezen over <a href="https://www.dataversity.net/acid-vs-base-the-shifting-ph-of-database-transaction-processing">Base, Acid en het CAP theorema</a>. De &#8220;C&#8221; in zowel ACID als CAP staat voor Consistentie. Maar eigenlijk is dit een beetje verwarrend, want het is niet <a href="https://www.voltdb.com/blog/2015/10/22/disambiguating-acid-cap">dezelfde consistentie die daarbij wordt bedoelt</a>.</p>

<p style="text-align: justify; margin-bottom: 0.625em;">De ACID regels stammen reeds uit de jaren 1970, een tijd toen er nog nauwelijks sprake was van gedistribueerde systemen; het ging erom transacties te definiëren in een database wereld waar het gelijktijdig gebruik van een database door meerdere gebruikers nog in zijn kinderschoenen stond.</p>

<p style="text-align: justify; margin-bottom: 0.625em;">Consistentie in ACID stelt specifiek dat transacties de regels en restricties van de database moeten volgen (b.v. bepaalde constraints op data, maar eveneens zaken als triggers) en dat alle data die naar de database geschreven wordt, de database in een geldige toestand moet achterlaten. Dit geldt voor de gehele transactie. Geen enkele gebruiker mag de database in een toestand kunnen zien die ongeldig zou zijn, ook niet tijdens het uitvoeren van een transactie van een andere gebruiker.</p>

<p style="text-align: justify; margin-bottom: 0.625em;">Het CAP theorema werd pas geformuleerd in 2000 en geldt voor alle gedistribueerde systemen (niet enkel databases). Het doel was hier om scherp te stellen dat men keuzes zal moeten maken wanneer er een netwerkpartitie optreedt in een dergelijk systeem. Consistentie in CAP betekent dat alle replica&#8217;s van hetzelfde gegeven ook dezelfde waarde zullen hebben overheen het hele systeem (en dus in alle nodes).</p>

<p style="text-align: justify; margin-bottom: 0.625em;">Het wordt extra interessant wanneer een systeem zowel de consistentie in ACID als die van CAP wil hebben. De ACID principes moeten dan over alle nodes heen tegelijk geldig zijn. Het spreekt voor zich dat dit niet eenvoudig is en, zeker in het geval van een netwerkpartitie, voor een specifieke aanpak zal zorgen.</p>  
</div>



<p class="justify-text">De afkorting <a href="https://en.wikipedia.org/wiki/PACELC_theorem" data-type="URL" data-id="https://en.wikipedia.org/wiki/PACELC_theorem">PACELC</a> kan men dan via het volgende zinnetje opbouwen: Bij netwerkpartitie (P), moet men kiezen tussen beschikbaarheid (Availability) en Consistentie (C), en anders (Else), tussen latency (L) en consistentie (C).</p>



<p class="justify-text">Wanneer men over voldoende performantie beschikt, het systeem niet overbelast is, en er geen fouten optreden, zal men in de praktijk weinig merken van dit verschil tussen latentie en consistentie. Maar de specifieke garanties die worden geboden zijn echter wel heel belangrijk om weten wanneer men deze databases gaat gebruiken, vermits er altijd wel iets zal misgaan en er altijd wel een situatie kan optreden die het systeem te zwaar belast. Wil men ten allen tijde kunnen rekenen op consistentie, of op een zo hoog mogelijke beschikbaarheid en het zo weinig mogelijk missen en zo snel mogelijk afhandelen van requests? Een banktoepassing zal typisch het eerste willen, een webshop misschien eerder het tweede (en als er iets misgaat door inconsistentie in de data, maakt men dit achteraf wel goed met de klant).</p>



<p class="justify-text">In de praktijk is PACELC eigenlijk nuttiger dan CAP: indien men een systeem met hoge beschikbaarheid wil voorzien, moet men de facto aan duplicatie gaan doen, ook van data. Vanaf het moment dat data gedupliceerd wordt en verspreid over meerdere plaatsen, zal men een afweging moeten maken tussen hoe consistent men deze wil houden, en hoe snel men er mee wil kunnen werken.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="555" src="/wp-content/uploads/2020/04/pacelc-transparant-1024x555.png" alt="" class="wp-image-14454" srcset="https://www.smalsresearch.be/wp-content/uploads/2020/04/pacelc-transparant-1024x555.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2020/04/pacelc-transparant-300x163.png 300w, https://www.smalsresearch.be/wp-content/uploads/2020/04/pacelc-transparant-768x416.png 768w, https://www.smalsresearch.be/wp-content/uploads/2020/04/pacelc-transparant.png 1048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figuur 1: Het PACELC theorema</figcaption></figure>



<h2 class="wp-block-heading">NewSQL in de Praktijk: Testresultaten</h2>



<p class="justify-text">We testten 3 verschillende NewSQL producten tijdens deze studie: <a href="https://www.cockroachlabs.com/" data-type="URL" data-id="https://www.cockroachlabs.com/">CockroachDB</a>, <a href="https://pingcap.com/products/tidb/" data-type="URL" data-id="https://pingcap.com/products/tidb/">TiDB</a> en <a href="https://nuodb.com/" data-type="URL" data-id="https://nuodb.com/">NuoDB</a>. Het voornaamste doel van de test was om het gedrag bij het uitvallen van nodes te testen. De theorie stelt dat deze databases netjes blijven werken zolang een meerderheid van de nodes draait en deze elkaar kunnen zien. Op die manier kan er altijd een concensus worden bereikt betreffende transacties.</p>



<p class="justify-text">De test ging als volgt: eerst bouwen we een cluster van 3 nodes voor elk van deze producten; daar wordt eventueel nog een <a href="https://en.wikipedia.org/wiki/Load_balancing_(computing)" data-type="URL" data-id="https://en.wikipedia.org/wiki/Load_balancing_(computing)">load balancer</a> aan toegevoegd en ook voorzien we een machine die als client zal optreden. Daarna volgen er twee testen waarbij we de cluster vanaf de client machine bestoken met requests. We gebruiken hierbij de TPCC, dit is een gestandaardiseerde test voor OnLine Transaction Processing (OLTP) Databases, het soort databases die we typisch gebruiken als backend voor online toepassingen (de <a href="https://nl.wikipedia.org/wiki/Online_analytical_processing" data-type="URL" data-id="https://nl.wikipedia.org/wiki/Online_analytical_processing">typische tegenhangers</a> zijn databases die zich focussen op analytics). De <a href="https://www.tpc.org/tpcc/" type="URL" id="http://www.tpc.org/tpcc/">TPCC is &#8220;test C&#8221;</a> van de TPC (transaction processing performance council), en wordt vandaag beschouwd als de meest typische maatstaf.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="327" src="/wp-content/uploads/2020/08/threelogos-1024x327.png" alt="" class="wp-image-14703" srcset="https://www.smalsresearch.be/wp-content/uploads/2020/08/threelogos-1024x327.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2020/08/threelogos-768x246.png 768w, https://www.smalsresearch.be/wp-content/uploads/2020/08/threelogos-2048x655.png 2048w, https://www.smalsresearch.be/wp-content/uploads/2020/08/threelogos-300x96.png 300w, https://www.smalsresearch.be/wp-content/uploads/2020/08/threelogos-1536x491.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figuur 2: De logo&#8217;s van CockroachDB, NuoDB en TiDB, de drie geteste producten</figcaption></figure>



<p class="justify-text">De twee testen verschillen in het volgende: de eerste keer gaat er niets mis: alle drie de nodes blijven netjes werken. Bij de tweede test-run zullen we echter na een tijdje één van de nodes geforceerd uitschakelen, alsof deze een stroompanne ondervindt. Deze node zal dan de helft van de testperiode uitgeschakeld blijven, om dan, nog tijdens de test, terug op te worden gestart.</p>



<p class="justify-text">De TPCC is in principe ook een performantietest, dus we kunnen eigenlijk ook zien hoeveel verkeer deze databases aankunnen. Dit was echter niet het hoofdopzet van de test en de resultaten kunnen hierdoor wat meer uit elkaar liggen. Ook spelen er bepaalde aspecten aan sommige NewSQL databases, die een impact hebben op de performantie, niet mee in onze test, vanwege de setup (verschillende nodes op virtuele machines, echter allen op dezelfde fysieke machine). Zo is de fysieke afstand tussen nodes belangrijk, en vaak is het ook van belang of de systeemklokken op de verschillende nodes niet teveel van elkaar afwijken (Voor <a href="https://cloud.google.com/spanner?hl=nl" data-type="URL" data-id="https://cloud.google.com/spanner?hl=nl">Google Spanner</a> rolt men hiertoe atoomklokken uit in de verschillende datacenters; er bestaan echter ook aanvaardbare goedkopere oplossingen).</p>



<p class="justify-text">Voor de drie geteste databases bekwamen we gelijkaardige resultaten. Alle drie bleven ze functioneel bij het falen van één van de drie nodes. Bij de laatste, NuoDB, vroeg dit echter extra configuratiewerk. Voor CockroachDB en TiDB was dit out-of-the-box ondersteund. Daarnaast werd de performantie weinig beïnvloed door het node-falen; er waren nauwelijks minder transacties in de testperiode (enkel voor NuoDB was het verschil iets groter). Wat wel opviel, was dat enkele transacties een stuk langer duurden. We vermoeden dat deze transacties werden gedaan op het moment van het node-falen, waardoor ze werden benadeeld. Al bij al voldeden de drie geteste producten echter wel goed aan onze verwachtingen van beschikbaarheid. Hieronder een voorbeeld van de cijfers van de test van CockroachDB.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1015" height="442" src="/wp-content/uploads/2020/04/cockroachDB-testresult.png" alt="" class="wp-image-14473" srcset="https://www.smalsresearch.be/wp-content/uploads/2020/04/cockroachDB-testresult.png 1015w, https://www.smalsresearch.be/wp-content/uploads/2020/04/cockroachDB-testresult-300x131.png 300w, https://www.smalsresearch.be/wp-content/uploads/2020/04/cockroachDB-testresult-768x334.png 768w" sizes="auto, (max-width: 1015px) 100vw, 1015px" /><figcaption>Figuur 3: Vergelijking van de testresultaten zonder en met node-falen voor CockroachDB. In groen is het totaal aantal transacties aangeduid. In rood de sterke vertraging van de traagste transactie bij node-falen.</figcaption></figure>



<h2 class="wp-block-heading">Besluit</h2>



<p class="justify-text">NewSQL databases beginnen vrij matuur te zijn. Ze zijn een prima keuze wanneer we voor een toepassing de voorkeur geven aan het gemak van data die consistent blijft en ondersteuning voor SQL, maar tegelijk toch een zeer goede beschikbaarheid willen. Het gedistribueerd karakter is ingebouwd in de technologie (ze zijn dus &#8216;cloud native&#8217;), waardoor ze zich veel gemakkelijker dan de traditionele relationele databases laten uitrollen in clusters van meerdere evenwaardige nodes (&#8216;<a href="https://en.wikipedia.org/wiki/Multi-master_replication" data-type="URL" data-id="https://en.wikipedia.org/wiki/Multi-master_replication">multi-master</a>&#8216;, i.t.t. de zgn. &#8216;master-slave&#8217; setup), waarvan slechts een meerderheid operationeel moet blijven om het systeem beschikbaar te houden.</p>



<p class="justify-text">We kunnen echter ook enkele aandachtspunten aanduiden. Om een effectief systeem met hoge beschikbaarheid te hebben, moet men deze databases in principe uitrollen op verschillende locaties (eventueel zelfs in verschillende datacenters). Dit om ervoor te zorgen dat de kans zo klein mogelijk is dat verschillende nodes tegelijk falen. Tegelijk is het van belang dat deze nodes vlot met elkaar kunnen communiceren (en dat dit verkeer niet wordt onderschept) en op systemen draaien met een zo gelijk mogelijke systeemklok (voor sommige architecturen), anders wordt de performantie aangetast.</p>



<p class="justify-text">Deze aandachtspunten in beschouwing genomen, kunnen we echter besluiten dat NewSQL databases een goede keuze vormen wanneer men een cluster van redundante databases wil uitrollen voor verhoogde beschikbaarheid.</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>NewSQL, een Upgrade voor je oude Database&#160;?</title>
		<link>https://www.smalsresearch.be/newsql-een-upgrade-voor-je-oude-database/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Thu, 10 Oct 2019 07:39:20 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[CAP]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBMS]]></category>
		<category><![CDATA[High Availability]]></category>
		<category><![CDATA[NewSQL]]></category>
		<category><![CDATA[NOSQL]]></category>
		<category><![CDATA[RDBMS]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">/?p=13610</guid>

					<description><![CDATA[De nieuwe Databases als kruising van NOSQL en SQL&#8230; NewSQL (uitspraak: “new sequel”) is een recente, moderne klasse van DataBase Management Systemen (DBMS), of, kortweg, databases. Deze klasse positioneert zich tegenover de reeds bestaande klasses van Relationele DBMS (RDBMS) en de zogenaamde NOSQL (“no sequel”) databases, waarbij NOSQL staat voor “Not Only SQL”, maar echter [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/10/logo2-newsql-transp.png" alt="logo-newsql" class="wp-image-13721" width="141" height="141" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/10/logo2-newsql-transp.png 461w, https://www.smalsresearch.be/wp-content/uploads/2019/10/logo2-newsql-transp-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2019/10/logo2-newsql-transp-300x300.png 300w" sizes="auto, (max-width: 141px) 100vw, 141px" /></figure></div>



<p style="text-align:center"><em>De nieuwe Databases als kruising van NOSQL en SQL&#8230;</em></p>



<p class="justify-text">NewSQL (uitspraak: “new sequel”) is een recente, moderne klasse van DataBase Management Systemen (DBMS), of, kortweg, databases. Deze klasse positioneert zich tegenover de reeds bestaande klasses van Relationele DBMS (RDBMS) en de zogenaamde NOSQL (“no sequel”) databases, waarbij NOSQL staat voor “Not Only SQL”, maar echter nog vaak als “No SQL” wordt begrepen. </p>



<div style="width: 400px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 3px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #eee; font-size: 0.8em; font-family: verdana;">
<p style="margin-bottom: 0.625em;"><strong><em>Definitie: BASE</em></strong></p>
<p style="text-align: justify; margin-bottom: 0.625em;"> BASE staat voor <i><b>B</b>asically <b>A</b>vailable, <b>S</b>oft state, <b>E</b>ventual consistency</i>. Het principe betekent dat men de voorkeur geeft aan het beschikbaar houden van de dienst (<i>Basically Available</i>), zelfs als verschillende nodes van de dienst elkaar niet meer kunnen bereiken (typisch door netwerk falen). De nodes zullen hierdoor ongesynchroniseerd worden met elkaar (vermits ze onafhankelijk blijven werken), maar wanneer ze terug verbonden geraken, zullen ze de consistentie herstellen (<i>Eventual Consistency</i>). Magie bestaat echter niet en het kan zijn dat dit een onvoldoende goed resultaat geeft. Daarom moeten applicatiebouwers extra aandacht schenken aan het omgaan met de consistentie wanneer ze van een dergelijke database gebruik maken (<i>Soft state</i>). Meer uitleg vind je
<a href="https://www.lifewire.com/abandoning-acid-in-favor-of-base-1019674">hier</a></p>  
</div>



<p class="justify-text">Deze laatste categorie maakte een decennium geleden furore als alternatief voor de traditionele RDBMS, en had als doel om zaken als performantie, schaalbaarheid, beschik-baarheid en distribueerbaarheid te verhogen, ten koste van de consistentie. Bij NOSQL databases sprak men vaak van “eventual consistency”, wat betekent dat men niet via transacties werkt, maar er eerder op rekent dat het systeem na verloop van tijd altijd opnieuw in een consistente toestand zal geraken. Dit maakt onderdeel uit van de &#8220;BASE principes&#8221; (zie kader). <a href="/nosql-databases-simpel-performant-schaalbaar/">NOSQL databases</a> bekeken we bij onderzoek reeds 9 jaar geleden, en recent gingen we dieper in op de subcategorie <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">graph databases</a>.</p>



<div style="width: 300px; display: block; align: left; vertical-align: top; float: left; border: 1px solid #ddd; margin: 3px 10px 5px 0px; padding: 5px 5px 0px 5px; background-color: #eee; font-size: 0.8em; font-family: verdana;">
<p style="margin-bottom: 0.625em;"><strong><em>Definitie: ACID</em></strong></p>
<p style="text-align: justify; margin-bottom: 0.625em;">De ACID principes zijn <i><b>A</b>tomicity, <b>C</b>onsistency, <b>I</b>solation, <b>D</b>urability</i>.</p>
<p style="text-align: justify; margin-bottom: 0.625em;"> Deze set van eigenschappen werd in het leven geroepen om de validiteit van transacties te kunnen garanderen, zelfs wanneer er fouten zouden optreden in het systeem. Typisch aan ACID is het gebruik van transacties: een sequentie van database operaties die aan de ACID principes voldoet en nooit onvolledig kan worden uitgevoerd, waardoor het systeem in een inconsistente toestand zou achterblijven. Zulk een transactie wordt dus altijd ofwel niet uitgevoerd, ofwel in haar geheel uitgevoerd (ze is atomair), laat het systeem in een consistente toestand achter, is geïsoleerd van andere transacties, en het resultaat ervan heeft een blijvend effect op het database systeem, zelfs indien het ná het uitvoeren van de transactie snel zou falen (durabiliteit). Meer uitleg vind je <a href="https://en.wikipedia.org/wiki/ACID">hier</a></p> 
</div>



<p class="justify-text">Voor vele toepassingen gebruikt men echter nog graag de traditionele RDBMS, nu smalend &#8220;Old SQL databases&#8221; genoemd. De reden is dat deze databases de verantwoordelijkheid om de data consistent te houden voor een groot stuk naar zich toetrekken, door het aanbieden van transactielogica. Deze logica zit vervat in de zogenaamde ACID principes (zie kader), die door deze databases worden ondersteund. Daarnaast kunnen applicatiebouwers ook moeilijk afscheid nemen van het gemak van SQL ondersteuning. Deze taal neemt heel wat werk uit handen van de developers (vaak wordt SQL ook gegenereerd door een library).</p>



<p class="justify-text">Met de NewSQL databases probeert men nu de voordelen van zowel NOSQL als RDBMS te verenigen. Dit type databases wordt beschreven als de oplossing om, zoals bij NOSQL mogelijk is, een <a href="/productiviteitsverhoging-met-paas/">horizontaal schaalbare</a> en gedistribueerde database op te zetten. Men streeft er dus naar om de performantie van NOSQL databases, die typisch hoger is dan die van RDBMS, te evenaren. Tegelijk probeert men dit te doen zonder aan de traditionele ACID principes te raken, die door RDBMS naar voren worden geschoven. </p>



<p class="justify-text">Hoe de NewSQL databases erin slagen deze eigenschappen te combineren, verschilt van geval tot geval. Een paar zaken hebben ze echter gemeen: ze ondersteunen, in tegenstelling tot de meeste NOSQL databases, het relationele model en ze gebruiken de taal SQL als de belangrijkste manier om met de database te interageren. Dit zijn typisch ook de belangrijkste kenmerken voor een RDBMS.</p>



<p class="justify-text">De vraag kan dus gesteld worden hoe gemakkelijk het is om een RDBMS te vervangen door een NewSQL database, gezien de manier om ermee om te gaan zo gelijkaardig is. Het is dus mogelijk dat NewSQL databases de resiliëntie van applicaties kunnen verhogen, doordat de resiliëntie van de onderliggende database verhoogt, en dit mogelijks met een beperkte migratie-effort, vanwege de compatibiliteit met de huidige gebruikte RDBMS. Verschillende NewSQL databases claimen compatibiliteit met een bestaande RDBMS (b.v. <a href="https://www.postgresql.org/">PostgreSQL</a>) en slagen hier dus redelijk in. Er zijn echter soms toch enige beperkingen op hoeveel men precies ondersteunt van SQL in vergelijking met de RDBMS. Dit komt doordat men niet ontsnapt aan het fundamentele CAP theorema.</p>



<p class="justify-text">Het <strong>CAP theorema</strong> voor gedistribueerde systemen kwam reeds lang geleden aan bod op deze blog. Kort uitgelegd komt het erop neer dat je hoogstens twee van de volgende 3 zaken tegelijk kan hebben: <strong>Availability</strong> (je krijgt altijd een antwoord van het systeem), <strong>Consistency</strong> (je ziet ten allen tijde de meest recent geschreven data), <strong>Partition tolerance</strong> (het systeem blijft werken, ook al functioneert het netwerk tussen de nodes van het systeem niet meer). Ook het <a href="/99-9-availability-fundamenteel-anders/">CAP theorema</a> werd bij onderzoek reeds uitvoerig belicht.</p>



<div class="wp-block-image justify-text"><figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/10/cap-theorem-transp.png" alt="Cap Theorema" class="wp-image-13707" width="578" height="441" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/10/cap-theorem-transp.png 915w, https://www.smalsresearch.be/wp-content/uploads/2019/10/cap-theorem-transp-300x229.png 300w, https://www.smalsresearch.be/wp-content/uploads/2019/10/cap-theorem-transp-768x586.png 768w" sizes="auto, (max-width: 578px) 100vw, 578px" /><figcaption>Fig. 1: Het CAP theorema zegt dat de doorsnede van Availability, Consistency en Partition Tolerance leeg blijft. Enkel in de doorsnede van telkens slechts 2 van de 3 zaken kan men oplossingen hebben. De verschillende types databases kan men hier goed in plaatsen.</figcaption></figure></div>



<div style="width: 400px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 3px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #fffd24; font-size: 0.8em; font-family: verdana;">
<p style="margin-bottom: 0.625em;"><strong><em>Over Availability en de SLA</em></strong></p>
<p style="text-align: justify; margin-bottom: 0.625em;"> Bij het bespreken van het CAP theorema wordt gesproken over <em>volledige Availability</em>. Wil dit dan zeggen dat &#8220;A&#8221; systemen, zoals de &#8220;AP&#8221; NOSQL databases, een <b>up-time hebben van 100%</b>&nbsp;? Spijtig genoeg niet. Het gaat hier nog steeds over een theoretische bovengrens. De availability waarvan sprake in het CAP theorema is een beetje kunstmatig: ze gaat ervan uit dat een enkele node niet zal falen (men beschouwt enkel netwerkfalen). In de praktijk is dat natuurlijk niet het geval, vandaar dat de SLA van een &#8220;A&#8221; systeem ook geen 100% zal zijn. Traditionele single-node databases, die geen rekening moeten houden met netwerk partities, zijn dus uiteraard ook niet 100% beschikbaar.<br>
Bij gedistribueerde systemen tracht men dit echter wel te benaderen, doordat de kans dat verschillende nodes tegelijk falen, veel lager ligt dan de kans dat één node faalt, waardoor men dus voor een stuk beschikbaarheid behoudt, zelfs bij falen. Het feit dat één node op zich makkelijker kan falen, is dan ook net één van de redenen om over te stappen op een gedistribueerd systeem (naast verhoogde schaal en performantie). Bij NewSQL databases bekomt men dan uiteindelijk op die manier óók een verhoogde beschikbaarheid, ook al zijn het systemen die de &#8220;A&#8221; uit het CAP theorema niet mee opnemen: zolang een meerderheid van de nodes actief blijft (en kan communiceren), blijft dit deel van het totale systeem beschikbaar, en aldus bekomt men <b>ook voor NewSQL systemen een hogere SLA.</b></p>  
</div>



<p class="justify-text">Sowieso zal je in een gedistribueerd systeem altijd te maken krijgen met netwerk falen, dus je moet &#8220;iets&#8221; doen daarmee en dus de &#8220;P&#8221; ondersteunen. Dan rest dus nog de keuze of je voor &#8220;A&#8221; of &#8220;C&#8221; gaat. NOSQL databases kiezen voor &#8220;A&#8221;: alle nodes blijven werken, ook al zijn ze niet meer verbonden. Bijgevolg verliezen ze &#8220;C&#8221;: de data in de losgekoppelde nodes kan verschillen. Dit noemt men een &#8220;AP&#8221; systeem. NewSQL databases kiezen voor de andere aanpak: een aantal van de nodes die niet meer bereikbaar zijn, zullen een foutmelding geven en dus niet beschikbaar zijn. Zolang er een bepaalde meerderheid van nodes met elkaar kan communiceren, zullen deze beschikbaar blijven, maar het systeem is dus niet &#8220;100% beschikbaar&#8221;, enkel de nodes die de meerderheid vormen zijn dat. Dit wordt dan een &#8220;CP&#8221; systeem genoemd, want de nodes die nog werken zijn wel consistent.  In Fig. 1 zie je het CAP theorema grafisch uitgebeeld; wanneer er geen rekening wordt gehouden met Partition Tolerance (de bovenste van de drie doorsnedes), zit je met het type database &#8220;SQL&#8221;, t.t.z. de traditionele RDBMS die niet gedistribueerd werken.</p>



<h2 class="wp-block-heading">Wordt Vervolgd&#8230;</h2>



<p class="justify-text">NewSQL databases lijken erg veelbelovend. Ze bieden een consistente gegevensopslag aan, bovenop een performant en resiliënt gedistribueerd systeem. Ondanks het feit dat ze de Availability uit het CAP theorema laten vallen, bieden ze een hogere SLA aan dan niet-gedistribueerde databases. Daarnaast vertonen ze een vrij grote compatibiliteit met de traditionele RDBMS databases.</p>



<p class="justify-text">Momenteel loopt er bij Smals Onderzoek een studie naar deze soort databases, waarbij we deze claims verder zullen toetsen aan de hand van een paar testen, en waarin we ook enkele concrete producten zullen uitproberen. Meer hierover in een latere blog.</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Archivage des bases de données &#8211; Analyse du marché</title>
		<link>https://www.smalsresearch.be/archivage-des-bases-de-donnees-analyse-du-marche/</link>
		
		<dc:creator><![CDATA[Arnaud Hulstaert]]></dc:creator>
		<pubDate>Thu, 11 Apr 2013 13:40:24 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[archiving]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[records management]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">/?p=5490</guid>

					<description><![CDATA[Venant de finaliser une étude sur l&#8217;archivage des bases de données avec un collègue, nous avons mené un examen du marché via l&#8217;examen de quatre solutions existantes. Nous les avons confrontées à notre définition de l&#8217;archivage et aux différentes caractéristiques identifiées comme importantes pour ce type de solution. Pour mener cette étude, nous sommes partis [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignright size-full wp-image-5503" alt="db" src="/wp-content/uploads/2013/04/db.png" width="121" height="151" />Venant de finaliser une étude sur l&#8217;archivage des bases de données avec un collègue, nous avons mené un examen du marché via l&#8217;examen de quatre solutions existantes. Nous les avons confrontées à notre définition de l&#8217;archivage et aux différentes caractéristiques identifiées comme importantes pour ce type de solution.</p>
<p>Pour mener cette étude, nous sommes partis de la définition suivante de l&#8217;archivage (déjà exposées <a title="Archivage vs stockage" href="https://www.smalsresearch.be/archivage-vs-stockage/" target="_blank">ici</a>)&nbsp;:</p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-5507" alt="archivage" src="/wp-content/uploads/2013/04/archivage.png" width="77" height="75" />« <em><strong><span style="text-decoration: underline;">Archiver</span></strong> consiste à prendre un objet et à le transférer sous certaines conditions dans un système qui permettra d’en assurer la préservation pendant un certain laps de temps avec toute la sécurité requise</em> ».<a title="" href="#_ftn1">[1]</a> Ce qui implique les actions suivantes :</p>
<ul>
<li>sélection de l’information ;</li>
<li>transfert dans un autre système pour en assurer la sécurité (gestion de l’intégrité et de l’authenticité) ;</li>
<li>préservation de l’information, c’est-à-dire aussi la couche physique que la couche logique et sémantique ;</li>
<li>gestion de la durée de conservation de l’information.</li>
</ul>
<p>Il s’agit donc d’une définition et d’une acceptation plus large (issues du domaine du « records management ») que le transfert de vieilles données « à la cave », conception encore largement répandue et reprise sous le terme anglais « archiving ».</p>
<p>Nous avons envoyé cette définition, accompagnées d&#8217;autres éléments importants (<a href="/wp-content/uploads/2013/04/Database-Archiving-General-information-about-existing-solution.pdf" target="_blank">Database Archiving &#8211; General information about existing solutions</a>), aux fournisseurs que nous avons contactés en leur demandant de positionner leur solution par rapport à ces différents points. Sur cette base, nous avons pu distinguer différentes familles :</p>
<ul>
<li>Au niveau de la <span style="text-decoration: underline;"><strong>forme d’archivage</strong></span> : certains systèmes vont archiver les données sous la forme d’une autre base de données, de même type que la base de données de production ou non, tandis que d’autres vont archiver les données sous forme de fichiers, eux-mêmes référencés à l’aide de métadonnées. Si la forme « base de données » peut présenter des avantages, notamment en termes d’accès et de consultation, elle ne représente pas une solution à long terme. La conservation des données sous forme de fichiers est donc vivement recommandée à long terme.</li>
<li>Au niveau du <span style="text-decoration: underline;"><strong>processus de capture</strong></span> : certaines solutions (dites PULL) se connectent à la base de données source en vue d’extraire elles-mêmes les données sur la base des paramètres introduits. Ces solutions proposent des fonctionnalités avancées de data profiling, d’extraction, … Les autres systèmes (dits PUSH) sont plus passifs : les données sont extraites de la base de données de production et poussées vers la solution d’archivage (on parle de versement). Les systèmes PULL offrent une aide non négligeable aux utilisateurs mais posent néanmoins des questions de sécurité (puisque la solution d’archivage doit disposer de droits de suppression dans la base de données de production) et gèrent rarement les questions d’intégrité (cf. point suivant).</li>
<li>Au niveau de la <span style="text-decoration: underline;"><strong>gestion de l’intégrité</strong></span> : certains systèmes font de la gestion et du contrôle de l’intégrité des données une fonctionnalité au cœur de la solution, tandis que d’autres laissent ce soin à un outil tiers (que ce soit au niveau software ou hardware).</li>
</ul>
<p>Voici le tableau récapitulatif des solutions examinées (les solutions ont été anonymisées)&nbsp;:</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter  wp-image-5510" alt="tableau_recapitulatif_solutions" src="/wp-content/uploads/2013/04/tableau_recapitulatif_solutions.png" width="610" height="361" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/04/tableau_recapitulatif_solutions.png 871w, https://www.smalsresearch.be/wp-content/uploads/2013/04/tableau_recapitulatif_solutions-768x454.png 768w, https://www.smalsresearch.be/wp-content/uploads/2013/04/tableau_recapitulatif_solutions-300x177.png 300w" sizes="auto, (max-width: 610px) 100vw, 610px" /></p>
<p>Sur cette base, les éléments suivants ont pu être mis en évidence&nbsp;:</p>
<ul>
<li>Les solutions positionnées sur le marché du « <span style="text-decoration: underline;">Database Archiving</span> » sont toutes de type PULL. Ce positionnement est en cohérence avec la définition du terme anglais « <strong>archiving </strong>» qui consiste à déplacer des données moins utilisées ou ‘obsolètes’ vers un espace tiers afin d’optimiser les applications en production. Ces solutions ne traitent quasiment jamais de l’intégrité des données archivées. Par conséquent ces solutions ne répondent pas de manière complète à la problématique de l’archivage selon la définition que nous y avons donnée.<br />
Ces solutions présentent toutefois des fonctionnalités avancées pour l’extraction des données.</li>
<li>Les solutions de type PUSH se situent davantage sur le marché du <strong>records management</strong>. Dans ce cas, l’intégrité fait partie inhérente des solutions mais elles disposent de fonctionnalités de gestion du cycle de vie.</li>
<li>Pour une couverture fonctionnelle complète de la définition de l’archivage que nous avons proposée, deux outils seront donc nécessaires, quoique la partie extraction puisse être exécutée manuellement, c’est-à-dire par des administrateurs de la base à l’aide de requêtes SQL.</li>
<li>La méthode PULL est transactionnelle, ce qui correspond davantage à la manière de travailler dans le monde des bases de données. La transaction est terminée quand les données sont archivées, alors que dans le cas de la méthode PUSH, la transaction se terminerait par le dépôt des données sur un file system où la solution d’archivage les capture. Par conséquent, la méthode PUSH ne permet pas une transaction unique positionnant d’abord l’archivage effectif des données et ensuite la suppression desdites données.</li>
<li>Les fonctionnalités d’extraction sont uniquement disponibles pour les bases de données relationnelles. Aucun fournisseur n’a de connecteurs vers des bases de données non relationnelles, même ceux qui ont des relations historiques avec ce type de base de données.</li>
<li>La consultation des données archivées issues d’un DBMS est plus mures dans le cas des outils PULL que PUSH. Ces solutions proposent généralement des fonctionnalités d’accès soit via IHM, soit via des connecteurs ODBC/JDBC (ce qui rend les accès applicatifs possibles). Dans le cas des outils PUSH, des fonctionnalités de consultation et d’accès sont possibles mais plus génériques et elles prennent donc moins en compte les spécificités des données issues d’un DBMS.</li>
<li>Enfin, plusieurs solutions archivent les données dans un format ouvert et documenté (CSV, XML, containeur tar.gz), ce qui est un atout pour un archivage pérenne. Les solutions proposant des formats propriétaires ne sont donc pas à privilégier.</li>
</ul>
<p><figure id="attachment_5517" aria-describedby="caption-attachment-5517" style="width: 673px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2013/04/db_archiving_extract_example1.png"><img loading="lazy" decoding="async" class=" wp-image-5517 " alt="La solution effectue un profiling de la base de données et en propose une schématisation que l'utilisateur peut enrichir." src="/wp-content/uploads/2013/04/db_archiving_extract_example1.png" width="673" height="428" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/04/db_archiving_extract_example1.png 841w, https://www.smalsresearch.be/wp-content/uploads/2013/04/db_archiving_extract_example1-300x191.png 300w, https://www.smalsresearch.be/wp-content/uploads/2013/04/db_archiving_extract_example1-768x489.png 768w" sizes="auto, (max-width: 673px) 100vw, 673px" /></a><figcaption id="caption-attachment-5517" class="wp-caption-text">La solution effectue un profiling de la base de données et en propose une schéma que l&#8217;utilisateur peut enrichir.</figcaption></figure></p>
<p>Un conseil pour finir&nbsp;: indiquez bien aux fournisseurs votre définition de l&#8217;archivage afin de pouvoir examiner leurs solutions de manière critique.</p>
<hr align="left" size="1" width="33%" />
<div>
<p><a title="" href="#_ftnref1">[1]</a> M.-A. Chabin, <em>Moreq2 et archivage sécurisé</em>, Fédération Nationale des Tiers de Confiance, 2009, p. 6.</p>
</div>
<p><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:DoNotShowPropertyChanges/>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>FR-BE</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="&#45;-"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" Name="footnote text"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="0" Name="footnote reference"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>



<style>
 /* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
</style>

<![endif]--></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>NoSQL databases &#8211; simpel, performant &#038; schaalbaar</title>
		<link>https://www.smalsresearch.be/nosql-databases-simpel-performant-schaalbaar/</link>
					<comments>https://www.smalsresearch.be/nosql-databases-simpel-performant-schaalbaar/#comments</comments>
		
		<dc:creator><![CDATA[Johan Loeckx]]></dc:creator>
		<pubDate>Wed, 05 May 2010 09:26:30 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[data warehouse]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<guid isPermaLink="false">http://blogs.smals-mvm.be/research/?p=1105</guid>

					<description><![CDATA[Sinds de komst van Web 2.0 is de hoeveelheid informatie die opgeslagen en verwerkt moet worden gigantisch toegenomen: elke dag genereren miljoenen mensen massa&#8217;s ongestructureerde data &#8212; documenten, emails, tweets, foto&#8217;s,etc&#8230; Traditionele relationele databanken (gebaseerd op SQL) zijn van nature niet goed geschikt om met deze vormen van gegevens om te gaan omdat ongestructureerde data [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Sinds de komst van Web 2.0 is de hoeveelheid informatie die opgeslagen en verwerkt moet worden gigantisch toegenomen: elke dag genereren miljoenen mensen massa&#8217;s ongestructureerde data &#8212; documenten, emails, tweets, foto&#8217;s,etc&#8230;</p>
<p style="text-align: justify;">Traditionele relationele databanken (gebaseerd op SQL) zijn van nature niet goed geschikt om met deze vormen van gegevens om te gaan omdat ongestructureerde data zich niet goed vertaalt in een vast schema.  Schaalbaarheid wordt dan ook een probleem.</p>
<p style="text-align: justify;">Om deze reden heeft er zich sinds enkele jaren de trend ingezet om <strong>af te stappen van de doctrine van relationele-databanken</strong>.  Deze beweging wordt aangeduid met de term &#8220;NoSQL&#8221;  en bestaat sinds ongeveer 1998.</p>
<p><em>  </em></p>
<h1>Geschiedenis</h1>
<p style="text-align: justify;">NoSQL (soms ook &#8220;not-only-SQL&#8221; genoemd) is een controversiële benaming bedoeld om developers wakker te schudden en te confronteren met het feit dat er naast SQL nog andere types databanken bestaan, die efficiënter of eenvoudiger zijn. Kort komt het erop neer dat men voor elke toepassing een aangepast databankalgoritme gaat gebruiken, in plaats van RDBM systemen te gebruiken in een  &#8220;one-size-fits-all&#8221; aanpak.</p>
<p style="text-align: justify;"><span id="more-1105"></span></p>
<p style="text-align: justify;">De idee van niet-relationele databanken is uiteraard niet nieuw, ze gaan al mee sinds de jaren &#8217;60.  De recente explosie van ongestructureerde data en de mogelijkheden van Cloud Computing hebben ze echter nieuw leven ingeblazen.</p>
<p><em>  </em></p>
<h1>Definitie</h1>
<p style="text-align: justify;">Conceptueel komt het erop neer dat men afstapt van één universeel model voor alle databanken, zoals bij Relationele Databank systemen het geval is.  <strong> </strong></p>
<p style="text-align: justify;">In de plaats daarvan gaat men <strong>specifieke, conceptueel simpele databanken gebruiken</strong> die een hogere performantie bieden, eenvoudig te begrijpen zijn en (meestal) horizontaal extreem schaalbaar. Vooral bij ongestructureerde data blijkt deze aanpak erg vruchtbaar, in tegenstelling tot relationele databanken.</p>
<p style="text-align: justify;">NoSQL databanken zijn <strong>minder flexibel </strong>en hierdoor ook conceptueel eenvoudiger. Ze zijn zogenaamd <strong>&#8220;schema free&#8221;</strong>, kennen geen JOINs en worden niet gequeried aan de hand van SQL maar aan de hand van een simpele API.  Omwille van deze redenen zijn ze dan ook performant. NoSQL databanken kunnen, omwille van hun beperkte functionaliteit en flexibiliteit,<strong> erg performant en vaak ook <em>extreem schaalbaar</em> geïmplementeerd</strong> worden.  Er wordt echter meer verantwoordelijkheid doorgeschoven naar de ontwerper.</p>
<p><em>  </em></p>
<h1>Types NoSQL databanken</h1>
<p style="text-align: justify;">Momenteel bestaan NoSQL databanken grofweg uit volgende vier categorieën:</p>
<h2>Key-value stores</h2>
<p style="text-align: justify;">Een key-value store is niets meer dan een <em>hash</em>: een vlakke gestructureerde databank die bestaat uit <strong>een verzameling unieke paren van keys en bijhorende value</strong>. Door hun grote eenvoud zijn ze extreem snel &amp; schaalbaar.  De value is van het type &#8220;blob&#8221; en kan dus vanalles zijn. <em>Voorbeelden: </em>Amazon Dynamo, Voldemort,&#8230;</p>
<p style="text-align: center;"><a href="/wp-content/uploads/2010/05/key_value_store.png"><img loading="lazy" decoding="async" class="size-medium wp-image-1145 aligncenter" title="key_value_store" alt="Key-value store" src="/wp-content/uploads/2010/05/key_value_store-300x205.png" width="410" height="280" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/05/key_value_store-300x205.png 300w, https://www.smalsresearch.be/wp-content/uploads/2010/05/key_value_store.png 510w" sizes="auto, (max-width: 410px) 100vw, 410px" /></a></p>
<p><em><br />
</em></p>
<h2>Column-Oriented databases</h2>
<p style="text-align: justify;">Kolom-georienteerde databanken bewaren sterk-gestructureerde gegevens in een tabel gebaseerd op kolommen in plaats van rijen.  Ze worden vaak gebruikt in datawarehouses en andere data-intensieve applicaties omdat ze kolom-gerelateerde bewerkingen (zogenaamde <em>geaggregeerde bewerkingen</em>) in een gedistribueerde omgeving versimpelen &amp; versnellen: de disk seek time wordt aanzienlijk verkleind als alle gegevens uit één kolom achtereen staat op disk&#8230;.<em> </em></p>
<p style="text-align: center;"><a href="/wp-content/uploads/2010/05/column_oriented_store.png"><img loading="lazy" decoding="async" class="size-medium wp-image-1151 aligncenter" title="column_oriented_store" alt="Column-oriented store" src="/wp-content/uploads/2010/05/column_oriented_store-300x206.png" width="445" height="305" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/05/column_oriented_store-300x206.png 300w, https://www.smalsresearch.be/wp-content/uploads/2010/05/column_oriented_store.png 564w" sizes="auto, (max-width: 445px) 100vw, 445px" /></a></p>
<p style="text-align: justify;">Bovendien wordt ook compressie efficiënter omdat gelijkaardige data (gegevens uit één kolom) waarschijnlijk meer gelijkaardige patronen bevat.  Daartegenover staat dat random access trager wordt.<em> Voorbeelden</em>: Cassandra (Facebook), Google BigTable, Apache HBase,&#8230;</p>
<p><em><br />
</em></p>
<h2>Document-based stores</h2>
<p style="text-align: justify;">Dit type databank is in feite een uitbreiding van de key-value store, waarbij de <em>value</em> een heel <em>record </em>(bv. XML) is waarvan de structuur gekend is door de databank en door haar ook gequeried kan worden. <em>Voorbeelden: </em>Apache CouchDB, Amazon SimpleDB,&#8230;</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2010/05/document_store.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-1149" title="document_store" alt="Dcoument Store" src="/wp-content/uploads/2010/05/document_store-300x206.png" width="451" height="311" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/05/document_store-300x206.png 300w, https://www.smalsresearch.be/wp-content/uploads/2010/05/document_store.png 542w" sizes="auto, (max-width: 451px) 100vw, 451px" /></a></p>
<p><em><br />
</em></p>
<h2>Graph databases</h2>
<p style="text-align: justify;">In Graph Databases worden gegevens voorgesteld door een geheel van entiteiten (nodes) en verbindingen (edges) en relaties (properties) tussen deze entiteiten. Er worden door de API verschillende methodes aangeboden die de manipulatie van de grafen en het doorzoeken ervan mogelijk maakt.  Ze zijn niet gebaseerd op JOINs en bovendien is de structuur (relatie tussen de entiteiten) vrij, in tegenstelling tot relationele databases.  <em>Voorbeelden: </em>InfoGrid, Neo4j,&#8230;</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2010/05/graph_databases.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-1158" title="graph_databases" alt="Graph Databases" src="/wp-content/uploads/2010/05/graph_databases-300x235.png" width="477" height="373" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/05/graph_databases-300x235.png 300w, https://www.smalsresearch.be/wp-content/uploads/2010/05/graph_databases.png 553w" sizes="auto, (max-width: 477px) 100vw, 477px" /></a></p>
<p><em>  </em></p>
<h1>High availability</h1>
<h2>Theoretische achtergrond</h2>
<p style="text-align: justify;">NoSQL databanken worden vaak geassocieerd met <em>High Availability</em>. De reden hiervoor wordt in volgende paragrafen uitgelegd, maar eerst moeten we dat dieper ingaan op de theoretische achtergrond van High Availability.</p>
<p style="text-align: justify;">Het <a title="CAP theorema" href="https://www.julianbrowne.com/article/viewer/brewers-cap-theorem" target="_blank">CAP theorema</a> poneert dat bij gedistribueerde systemen (dus bij schaalbare systemen), <strong>van de volgende drie <a href="https://en.wikipedia.org/wiki/Non-Functional_Requirements" target="_blank">niet-functionele requirements (NFR&#8217;s):</a></strong></p>
<ul>
<li><strong>Consistency</strong> (elk deelsysteem geeft hetzelfde antwoord)</li>
<li><strong>Availability</strong> (we krijgen steeds antwoord)</li>
<li><strong>Partition tolerance</strong> (we zijn niet gevoelig aan uitvallen van een  netwerkverbinding noch van een ander deelsysteem)</li>
</ul>
<p style="text-align: justify;"><strong>er slechts twéé tegelijk voldaan kunnen zijn.  </strong></p>
<p><em>  </em></p>
<h2>ACID vs. BASE</h2>
<p style="text-align: justify;">RDBMS systemen kiezen voor Consistency en Partition Intolerance en worden daarom ACID systemen genoemd:</p>
<ul>
<li><strong>Atomic</strong>: de mate waarin het DBMS garandeert dat een transactie ofwel geheel wordt uitgevoerd, ofwel geheel nietig is.</li>
</ul>
<ul>
<li><strong>Consistency</strong>: Een transactie creëert ofwel een nieuwe geldige staat of herstelt de staat die er was (in geval van een fout of een probleem). Dit impliceert dat na de transactie alle integriteitsregels van de database moeten gelden.</li>
</ul>
<ul>
<li><strong>Isolated</strong>: transacties worden geïsoleerd van elkaar uitgevoerd, dat wil zeggen dat transacties die tegelijkertijd worden uitgevoerd geen inzicht hebben in elkaars tussenresultaten.</li>
</ul>
<ul>
<li><strong>Durability</strong>: waardoor een voltooide transactie later niet ongeldig gemaakt kan worden.</li>
</ul>
<p style="text-align: justify;">Een van de gevolgen van het CAP theorema is dat deze RDBMs systemen erg moeilijk High Available te maken zijn (omdat ze voor P &amp; C kiezen).  NoSQL systemen daarentegen kiezen (meestal) voor de zogenaamde <a href="https://queue.acm.org/detail.cfm?id=1394128" target="_blank">BASE aanpak</a>:</p>
<ul>
<li><strong>(Basically) Available</strong>: Availability wordt bereikt door het falen van deelcomponenten toe te laten zonder het geheel unavailable te maken.  Inconsistenties worden op hoger, business level opgelost (de B werd toegevoegd voor het acroniem)</li>
</ul>
<ul>
<li><strong>Soft-State</strong>: De database is niet consistent op elk moment maar in voortdurende transitie.  Consistentie wordt niet afgedwongen na elke transactie. De verschillende transacties kunnen invloed op elkaar hebben.</li>
</ul>
<ul>
<li><strong>Eventually Consistent</strong>: In geval van falen en de problemen op business niveau op te vangen eerder dan op lager, programmatorisch niveau.  Vaak kan de availability enorm verhoogd worden met minimale gevolgen voor de gebruiker door hiermee rekening te houden tijdens het ontwerp van de software.  De truc is dat de inconsistenties op business niveau worden geresolved.</li>
</ul>
<p style="text-align: justify;"><strong>Merk op dat de zwakke, tijdelijke inconsistentie enkel optreedt op momenten dat een strikter systeem volledig onbeschikbaar zou zijn!!</strong></p>
<p><em>  </em></p>
<h1>Besluit</h1>
<p style="text-align: justify;">Door deze inconsistenties toe te laten, kan een hoge Availability bereikt worden voor een lagere kost in vergelijking met traditionele relationele databanken&#8230; Indien goed gebruikt zijn de voordelen van NoSQL databanken dus:</p>
<ul>
<li>hoge performantie</li>
<li>hoge beschikbaarheid</li>
<li>hoge schaalbaarheid</li>
<li>eenvoudig te begrijpen</li>
</ul>
<p style="text-align: justify;">Daartegenover staat echter dat:</p>
<ul>
<li>er meer werk aan de designer wordt overgelaten om de reliability te garanderen</li>
<li>er nagedacht moet worden over het oplossen van inconsistenties</li>
<li>minder documentatie en &#8220;ecostructure&#8221; (database management tools, &#8230;) beschikbaar is</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/nosql-databases-simpel-performant-schaalbaar/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
