WDTBD: MongoDB

MongoDB is een database die ‘NoSql’ is. De Database servers van bijv. Microsoft (MSSQL) en de bij Linux veel gebruikte database MySQL zijn relationeel en kunnen worden bijgewerkt via SQL opdrachten. Bij NoSQL biedt een database grof gezegd alleen opslag, zonder alle regeltjes en overhead van een relationele database.

Relationel SQL-databases vs NoSQL-databases

Kort door de bocht biedt een relationele SQL-database tools om je data-integriteit beschermen.

Dit kan door bijv. regels voor de data in te stellen (constraints): bijv. de regel dat bij een tabel met personen altijd een naam of een email adres moet altijd ingevuld zijn, die tevens uniek moet zijn. Ook kan je tabellen met elkaar in verband brengen. Zo kan je unieke waardes op één plek bewaren: als je bijv. een tabel met muziek-tracks hebt, kan je deze naar een tabel verwijzen die een lijst bevat met beschikbare genres. Iedere muziek-track moet naar één van deze genres verwijzen. Hiermee voorkom je dat je de variaties ‘Dans’, ‘Danceable’ hebt als je ‘Dance’ bedoeld. En door het gebruik van SQL heb je een programmeertaal om gegevens toe te voegen, aan te passen, te verwijderen en om gegevens te selecteren.

Het idee achter een NoSQL database is anders. De database is een grote bak waar je grof gezegd alles in kan stoppen. Bijna alle regels die in een relationele database gelden of die je kan toepassen moet je zelf maken. Voordeel is dat de database daardoor flexibel, snel en efficiënt kan zijn, het is niet beperkt door alle regeltjes en overhead van een relationele database.

Waarom nu NoSQL?

De NoSQL database past in de conjuctuur dat de opslag en business logica gescheiden moeten worden. Bij Classic-ASP was de ASP pagina voor presentatie: een HTML pagina met VBscripts waar je door een lijstje met gegevens kon itereren maar waar ook een deel van de business logica in zat. Maar het andere deel van de business logica bevond zich in de database en in SQL-statements. Als ASP-programmeur moest je dan ook kennis van SQL hebben, en aanpassingen hadden vaak effect op meerdere plekken.

Met dotNet is steeds meer de nadruk komen te liggen om de logica in de code te verankeren en de database als puur als opslag te gebruiken. Een relationele database is daardoor niet altijd meer de beste oplossing gebleken omdat daar nog altijd wat business logica in zat. En als je kiest om dat niet te gebruiken, dan zit je met een database systeem dat daar niet optimaal voor is.

Tot slot was opslagruimte vroeger beperkter, het spreiden van unieke gegevens in specifieke tabellen (normaliseren) kon veel veel ruimte schelen. Tegenwoordig is dat veel minder een issue en kan je de gegevens één op één opslaan zonder je direct zorgen te maken over beschikbare opslagruimte.

MongoDB

In MongoDB worden de gegeven opgeslagen als een soort JSON. Omdat er alle soorten objecten in kan opslaan, hebben ze er eigenlijk een variatie op die met binary data werkt: BSON.

Je werkt ook niet met tabellen maar met collecties: iedere collectie is een bak waar je vrij gegevens (objecten of ‘documenten’) in kan bewaren. Het concept van een tabel bestaat niet meer, je gegevens hoeven niet meer in de voorgeschreven velden van een tabel te worden geperst. Je kan objecten uit je C# code toevoegen aan de bak. Het is aan jou als programmeur om de bak goed te organiseren. Dat kan een nadeel zijn, want in een Relationele Database biedt daarvoor standaard tools om je data te organiseren, zodat je daar niet druk over hoeft te maken.

Een basis aspect van opslag is dat ieder object in de database een unieke sleutel moet hebben. Daarvoor is het veld “_id”. MongoDB kan zelf een ObjectId genereren, een unieke reeks van 25 karakters. Je kan als _id ook een nummer gebruiken, dan moet je wel zelf in je code de hoogste waarde van de _id opvragen en er 1 bij optellen. Daar zit wel een risico aan vast als er twee processen tegelijkertijd objecten willen toevoegen: daarvoor wordt dezelfde nieuwe _id berekend, maar geeft degene die als tweede wordt opgeslagen een foutmelding. Als alternatief kan je ook zelf een GUID genereren en meegeven bij de opslag.

Een limiet is de grootte van je object, die mag maximaal 16 Mb zijn. Maar dan moet je je ook afvragen of je data efficiënt is om in zo’n blok op te slaan.
Om met MongoDB te werken is kennis van JSON wel noodzakelijk. Om gegevens op te slaan en terug te vinden wordt het JSON-formaat toegepast. Voor het vullen van een database zijn er wel tools die minder met JSON doen, zoals MongoImport waarmee je bijv. ook data in CSV formaat kan toevoegen.

Tot slot: dit was vooral een omschrijving van MongoDB. Voor het daadwerkelijk toepassen van de database verwijs ik je naar de artikelen van Andras Nemes, waar ik dit artikel ook grotendeels op heb gebaseerd.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s