## NoSQL

In een relationele database ligt de structuur van de data vast. Er wordt een schema gebruikt voor het beschrijven van die structuur. Tabellen en kolommen hebben vaste namen en in eenzelfde kolom mogen geen verschillende soorten data voorkomen. Bij het ontwerpen van een database wordt voor de kolommen in de tabellen aangegeven wat voor soort data daarin opgeslagen gaan worden. Dat kan de ene keer om numerieke en een andere keer om bijvoorbeeld alfanumerieke gegevens gaan. In een kolom kunnen echter nooit verschillende typen data door elkaar worden gebruikt.
Voor het identificeren van een rij wordt een sleutel gebruikt. In een relationele database moet redundantie vermeden en consistentie nagestreefd worden.

Kenmerkend voor een relationele database is dat er met harde gestructureerde data wordt gewerkt. De data die zijn opgeslagen in de database kunnen worden bevraagd en worden bewerkt door SQL-opdrachten.
Er kunnen zich echter situaties voordoen waarbij het niet voor de hand ligt data op te slaan in een relationele database maar waarbij de voorkeur uitgaat naar het gebruik van een zogenaamde NoSQL database. Bijvoorbeeld als er met hele grote hoeveelheden gegevens gewerkt wordt. Dan is het niet handig om die gegevens op te slaan in een RDBMS. No in NoSQL staat overigens voor Not only.
Data in een relationele database staan altijd op dezelfde server. In de NoSQL database worden gegevens over meerdere servers verspreid. Het verspreiden van data over meerdere servers noemen we sharding. Een groot voordeel daarvan is dat gebruikers deze data snel kunnen benaderen.
Zo maakt Twitter voor het opslaan van tweets gebruik van een NoSQL oplossing. De tweets verouderen namelijk snel en alle tweets moeten ook nog eens bewaard blijven. Dankzij NoSQL kunnen de data over meerdere servers verspreid worden die dan aan elkaar worden gekoppeld.
Bij een NoSQL database werken niet alle gebruikers met dezelfde database. Dat wordt mogelijk gemaakt door op verschillende servers telkens een kopie van de oorspronkelijke database op te slaan. Dit principe wordt replication genoemd. Een nadeel van deze manier van werken, is dat de gebruikte gegevens niet altijd up to date zijn.
We hebben gezien dat in een relationele database het gebruikelijk is om alle gegevens in tabellen op te slaan. De structuur van een relationele database staat vast. Een NoSQL database hoeft niet altijd dezelfde vorm te hebben:

- Een NoSQL database kan zo georganiseerd zijn dat er alleen op een sleutel (key-value) gezocht kan worden, maar niet op de inhoud van de gegevens zelf.
- Een NoSQL database kan een document database zijn. Dit is een database die bestaat uit collections. Onder een collection verstaan we een verzameling van (min of meer) gelijksoortige documenten. In een document georiënteerde database staat, in tegenstelling tot een relationele database, niet alles vast. De database is flexibel. Veldnamen zijn dynamisch en er kunnen verschillende soorten gegevens worden opgeslagen zonder dat de structuur van de tabellen moet worden gewijzigd.
  Een document bestaat uit een verzameling velden (eigenschappen). Een veld heeft een naam en een waarde. In een collection wordt een document geïdentificeerd op basis van een sleutel. Deze sleutel wordt de document-id genoemd en staat altijd in het '_id'-veld.
- Een kenmerk van een NoSQL database is dat er variatie is in de structuur van de data. Kijk maar eens naar hoe gegevens van sensoren kunnen worden opgeslagen:
  {sensor: "temperature", time: "12:35", value: 12.7, location: "garden",}
  {sensor: "pressure", time: "12:17", value: 1024.3}
  {sensor: "light", time: "12:19", value: [200,150,150,30]}
  De documenten verschillen van elkaar. Niet elk document heeft dezelfde velden. Dat is ook logisch want we hebben te maken met verschillende soorten sensoren die ook weer verschillende soorten waarden opleveren. Een temperatuursensor, een druksensor en een lichtsensor. In een relationele database zou deze manier van gegevens opslaan ondenkbaar zijn.
- Een NoSQL database kan ook een Graaf database zijn. Dat is een database die gebruik maakt van een graaf om data te tonen en te verwerken. Een graaf bestaat uit een verzameling punten (knopen), waarvan sommigen verbonden zijn door lijnen (zijden).
  Graaf:

In een NoSQL database zijn data minder hard gestructureerd dan in een relationale database. Afhankelijk van het soort gegevens waarmee gewerkt wordt, kan gekozen worden voor opslag in een relationele- of een NoSQL database.