Tabel (database)
Een tabel is een entiteit binnen een relationele database. Een tabel heeft een naam en bestaat verder uit:
- 'Kolommen'. Deze vormen de definitie van de velden. Zo'n beschrijving luidt bijvoorbeeld:
- Numeriek 10.2, alleen lezen, verplicht in te vullen veld
- Alfanumeriek 20, lezen/schrijven, optioneel veld
- 'Rijen' of records. Deze bevatten de gegevens.
- Sleutel of index. Deze dienen om een gewenste rij snel op kunnen te zoeken. Vaak is er een primaire sleutel (primary key) en een aantal secundaire sleutels. De term zoeksleutel wordt ook vaak gebezigd.
- Triggersoftware. Deze wordt aangeroepen bij mutatie van een record. Dit in tegenstelling tot remote procedures die expliciet worden aangeroepen middels een remote procedure call (RPC) vanuit clientsoftware en dus geen enkele binding hebben met een tabel.
Een record bestaat weer uit velden. Elk veld komt overeen met een kolom die zijn metagegevens bevat. De gegevens in een tabel wordt vaak gepresenteerd als een matrix van velden waarvan de eerste regel de kolomnamen vormen.
In een goed genormaliseerde database komt een gegeven maar 1 keer voor. Om gegevens te koppelen kunnen relaties worden gebruikt tussen de tabellen.
Voorbeeld
bewerkenHieronder een voorbeeld van de tabellen Klanten en Facturen. In de tabel Klanten is de kolom KlantID de primaire sleutel. In de tabel Facturen is FactuurID de primaire sleutel. Dit zijn gebruikelijke namen voor sleutels. De getallen zelf betekenen niets, ze moeten echter wel uniek binnen de tabel zijn.
Een andere zoeksleutel voor Klanten zou kunnen zijn de combinatie van kolommen Naam en Achternaam. Deze hoeft dan niet uniek te zijn. De primaire sleutel is altijd uniek.
Klanten: KlantID Naam Achternaam ------- ---- ---------- 1 David Copperfield 2 Hans Kazan ↑ |__________ | | Facturen: ↓ FactuurID CustNr bedrag --------- ------- ------ 1 2 10 2 1 20 3 2 20 4 2 30 5 1 40
De nummers in de kolom Klanten.KlantID komen overeen met die in Facturen.CustNr (de namen van de kolommen mogen verschillen). Dit vormt een 1-op-n-relatie waarbij 1 klant n facturen kan hebben.
Relaties
bewerkenDe relationele database (RDB) heeft zijn naam te danken aan het feit dat een tabel relaties legt tussen velden: hetzij velden van één rij van één tabel, hetzij velden van verschillende tabellen, wanneer deze met elkaar verbonden zijn via een sleutelkolom. Binnen de tabel Facturen heeft het veld CustNr een foreign key. Dit omdat deze kolom in feite de sleutel is van een andere tabel.
Een tabel beschrijft in het algemeen meerdere n-op-m-relaties, omdat een kolom k1 meerdere keren dezelfde waarde kan bevatten, telkens horend bij een verschillende waarde van kolom k2, terwijl tezelfdertijd verschillende waarden van k1 met dezelfde waarde van k2 kunnen overeenkomen. Behoren kolommen k1 en k2 tot twee verschillende tabellen, dan heeft men dus een n-op-m-relatie tussen die twee tabellen. Meestal echter zal men in dat geval een extra tabel aanmaken die de koppeling implementeert. Zo'n tabel bevat dan twee foreign keys, één naar elk van de twee basistabellen. In die basistabellen komt elke waarde in kolom k1 resp. k2 slechts één keer voor, terwijl in de koppeltabel de oorspronkelijke n-op-m-relatie terug te vinden is. Meer hierover in het artikel Datamodel.
Index of sleutel
bewerkenEen index (of zoeksleutel) biedt de mogelijkheid om zeer snel de juiste rij in een tabel te vinden, ook als er miljoenen rijen zijn. De technieken die hiervoor gebruikt worden lijken op technieken die voor associatieve arrays gebruikt worden. Deze technieken zijn hashtabels en binaire bomen. Als een rij aan de tabel toegevoegd of verwijderd wordt, of er worden velden gewijzigd, dan moeten de indices bijgewerkt worden. Omdat indices soms in een aparte file bijgehouden worden spreekt men ook wel over het bijwerken van de index file.
Het bovenstaande impliceert dat hoe meer indices er over een tabel heen liggen, hoe langer het wijzigen van een rij duurt. Het opzoeken gaat echter sneller. Het opzoeken van een rij via kolommen waarvoor geen index bestaat duurt enorm lang vergeleken bij geïndexeerd zoeken. De ontwerper van de database moet het maken van indices dus goed kiezen naar aanleiding van het te verwachten gebruik. Bij een tabel die niet vaak wijzigt zal men geneigd zijn meer indices aan te leggen.
Verwar een index of sleutel niet met het begrip "primaire sleutel" of "foreign key" zoals hierboven bij "relaties" besproken!
Trigger
bewerkenUitleg
bewerkenHet is bij de meeste relationele databases mogelijk om triggers aan te brengen. Zo'n trigger zorgt ervoor dat op het moment dat er in een tabel een wijziging optreedt (record wijzigen, record verwijderen, record toevoegen) er een script (bijvoorbeeld SQL) of computerprogramma (bijvoorbeeld RPG) aangeroepen wordt dat controles uitvoert of meer wijzigingen in de database aanbrengt. Als zo'n controle faalt kan de wijziging niet uitgevoerd worden.
Voorbeelden
bewerken- Bij het verwijderen van een klant-record moeten ook de bijbehorende facturen verwijderd worden.
- Bij het aanmaken van een factuur-record wordt gecontroleerd of er wel een bijbehorende klant is. Zo nee, dan faalt het aanmaken van een factuur-record.
- Bij het wijzigen van een factuur-record wordt gecontroleerd of de klant-id niet verandert.
- Bij het aanmaken van een factuur wordt een teller in de klanten-tabel met één verhoogd.