Relationeel model: verschil tussen versies

39 bytes verwijderd ,  8 jaar geleden
k
Linkfix ivm sjabloonnaamgeving + standaardtabelopmaak
k (Linkfix ivm sjabloonnaamgeving + standaardtabelopmaak)
Het '''relationele model''' is een [[datamodel]] dat is opgebouwd volgens de regels van de [[relationele algebra]]. In [[relationele database]]s zijn gegevens opgeslagen in [[tabel (database)|tabellen]] die zijn ontworpen aan de hand van fysieke relationele datamodellen. Relationele [[database]]s zijn verre van de enige manier om data op te slaan, maar zij vormen tegenwoordig wel de facto de standaard in de industrie. Producten als [[Oracle (software)|Oracle]] en [[IBM DB2|DB2]] hebben de relationele datamodelleringstheorie in de jaren '80 algemeen ingang doen vinden in bedrijven en instellingen. Daarnaast hebben desktopproducten als [[Microsoft Access]] relationele databases toegankelijk gemaakt voor het grote publiek.
 
== Heersende verwarring in terminologie ==
Al te vaak wordt gedacht dat de term relationele database afkomstig is van het gebruik van relaties die tussen tabellen worden gelegd. Dit is niet het geval. Het woord relationeel is van toepassing binnen één tabel en heeft niets te maken met relaties tussen tabellen onderling.
De grote verwarring hier omtrent is het gevolg van diverse factoren :
#Een relationele database bestaat in de praktijk altijd uit verschillende tabellen waartussen relaties mogelijk zijn. Intuïtief (maar helaas ook foutief) is de link tussen 'relationele database' en deze relaties al te snel gelegd.
#In het Nederlandstalige taalgebied komt daar nog bij dat zowel de relatie-tabellen als de relaties tussen die tabellen (dus eigenlijk relaties tussen wiskundige relaties...) allebei kunnen aangeduid worden met het begrip 'relatie'. In het Engels is er een onderscheid 'Relation' en 'Relationship'.
 
=== Onderdelen ===
Een relatie bestaat uit een heading en een body. De heading bevat de attribuutnamen en de body de tuples. Een tuple is een verzameling van ongeordende attribuut-waarden, terwijl een attribuut op zijn beurt bestaat uit zijn naam en zijn waarde.
 
Omdat het gaat om een tweedimensionale tabel kunnen we (zij het grofweg) stellen dat :
* de heading overeenkomt met de tabelhoofding
* de body overeenkomt met de rijen daaronder
* een tuple overeenkomt met een rij,
* een attribuutwaarde overeenkomt met een waarde die in de tabel is ingevuld
* een attribuutnaam de naam is die wordt weergegeven in de tabelhoofding
 
=== Voorwaarden ===
Wanneer een relatie tuples bevat (wat niet noodzakelijk is)
* moeten de tuples uniek zijn : geen twee tuples zijn dezelfde
* moeten de tuples onderling verwisselbaar zijn
* moeten de attributen onderling verwisselbaar zijn
 
== Tabellen en relaties ==
=== Praktische benadering ===
Een tabel is een standaardmanier om gegevens op te slaan die reeds ingang vond lang voor er sprake was van databases en zelfs lang voor computers bestonden. Het is een logische en bijna intuïtieve manier van opslag die zelfs geen verdere uitleg vereist. Als het relationele model slechts hieruit bestond zou [[Ted Codd]], de man die dit model voor het eerst beschreef in 1970, er niet zo een naam mee hebben gemaakt, en zouden software-ontwikkelaars genoegen nemen met het ontwikkelen van spreadsheetprogramma's, de tabel-applicaties bij uitstek.
 
Toch zijn deze intuïtieve tabellen, met rijen en kolommen, ook de basis van het relationele model. Niet alle tabellen echter voldoen aan de eisen om in aanmerking te komen voor data-opslag binnen relationele databases. Tabellen moet hiervoor voldoen aan een aantal criteria. Indien een tabel voldoet aan al deze criteria, noemen we deze tabel een '''relatie-variabele''' . Alle relaties zijn dus tabellen, maar niet alle tabellen zijn '''relatie-variabelen'''. Omdat de term '''relatievariabele''' nogal omslachtig is, wordt die in praktijk steeds afgekort tot '''relvar''' (gelukkig ook in het Engels, daar kort voor '''relation variable''')
 
NOOT : verder gebruiken we voor rij ook wel de term record, en kolom noemen we ook wel variabele of attribuut.
 
De criteria waaraan een tabel moet voldoen om een relvar te worden genoemd, zijn :
 
*Elke rij beschrijft juist één entiteit.
*Binnen een rij worden nooit gegevens bijgehouden over meerdere entiteiten en één entiteit wordt binnen één tabel nooit beschreven over meerdere rijen.
*Elke rij is uniek.
*Elke kolom beschrijft precies één attribuut van een entiteit, en in elke rij is de betekenis van het attribuut dezelfde.
*De volgorde van de rijen is onbelangrijk. Dit wil zeggen dat een andere volgorde van rijen nooit tot informatie-verlies kan leiden.
*De volgorde van de kolommen is onbelangrijk. Dit wil zeggen dat een andere volgorde van kolommen nooit tot informatie-verlies kan leiden.
 
=== Wiskundige benadering : een basis ===
==== Inleiding ====
 
Een [[relatie (wiskunde)]] is het wiskundige begrip waarvan de term 'relationele database' is afgeleid. [[Ted Codd]] ontwikkelde indertijd het relationele model door [[wiskundige logica]] toe te passen op gegevensopslag en was daarmee de absolute grondlegger van de relationele algebra en het relationeel model en bij uitbreiding de relationele database.
 
 
===== n-tupels =====
 
Indien de relatie een verband uitdrukt tussen meer dan twee verzamelingen spreken we van een ''n-tupel'' waarbij de n staat voor de graad van de relatie (3 verzamelingen : 3-tupel, 4 verzamelingen : 4-tupel enzovoort; meer gebruikt is een n-tupel van graad 3, een n-tupel van graad 4 enz.)
 
Een voorbeeld van zo'n relatie is bv. x=y*z. Gesteld dat deze relatie plaats vindt tussen de 3 verzamelingen V1, V2 en V3 waarbij x deel uitmaakt van V1, y van V2 en z van V3 en waarbij V1,V2 en V3 allemaal bestaan uit de natuurlijke getallen 2 tot en met 10 is de relatie de verzameling van 3-tupels :
{(4,2,2),(6,2,3),(6,3,2),(8,2,4),(8,4,2),(9,3,3),(10,2,5),(10,5,2) }
 
==== De relatie : toepassing op gegevensopslag ====
Een relatie zoals de n-tupel van graad 3 hierboven laat zich dus schrijven door een ''opsomming van tupels''. Wiskundig wordt dit gedaan zoals hierboven : met accolades, haakjes en komma's. Een andere mogelijke manier om hetzelfde te doen is gebruikmaken van een tabelvorm. Als hoofding worden hier dan de verzamelingen gebruikt waaruit de waarden mogelijk kunnen komen.
 
Een relatie zoals de n-tupel van graad 3 hierboven laat zich dus schrijven door een ''opsomming van tupels''. Wiskundig wordt dit gedaan zoals hierboven : met accolades, haakjes en komma's. Een andere mogelijke manier om hetzelfde te doen is gebruikmaken van een tabelvorm. Als hoofding worden hier dan de verzamelingen gebruikt waaruit de waarden mogelijk kunnen komen.
Zo een [verzameling]heet binnen [gegevensopslag] : [het domein].
 
{| class="wikitable"
{| {{prettytable}}
|-
! V1
! V2
! V3
|-
| 4 || 2 || 2
|-
| 6 || 2 || 3
|-
| 6 || 3 || 2
|-
| 8 || 4 || 2
|-
| 8 || 2 || 4
|-
| 9 || 3 || 3
|-
| 10 || 2 || 5
|}
 
Bij een relatie van data is dat niet anders.
Evenals als de n-tupel van graad 3 hierboven ( V1=V2*V3 ) heeft elke relatie een omschrijving nodig van wat er precies wordt voorgesteld. Zo een omschrijving noemen we een predicaat. Bij gegevensopslag gaat dat steeds om een volzin. Het predicaat van de netgenoemde 3-tupel wordt dus :
 
de waarde van V1 is de waarde van V2 vermenigvuldigd met de waarde van V3.
 
Een concreet voorbeeld van een relatie van graad 3 kan zijn :
 
{| class="wikitable"
{| {{prettytable}}
|-
! KlantId
! Familienaam
! Voornaam
|-
| 1 || Verstappen || Jos
|-
| 2 || Vermeiren || Muriel
|}
 
Het predicaat in dit geval is :
 
Klant met als ID 'KlantId' heeft als familienaam 'Familienaam' en als voornaam 'Voornaam'