Introduktion til Database Terminologi

Et udviklingsprojekt i en it-sammenhæng starter med en forespørgsel eller nogle ønsker fra en rekvirent. Der er som regel intet digitalt involveret fra starten, med mindre det knytter sig tæt til et eksisterende system. Det første skridt man tager, er en række overvejelser om, hvilke informationer er involverede. Til dette semantiske arbejde bruger vi et redskab, Entity-Relationship modellering , ER modellering. Det minder en del om UML, som i øvrigt er langt yngre, så man skulle måske snarere sige, at at Unified Modelling Language på databaseområdet ligner ER modellering.

Figur 23.1. Eksempel på en ER model

ER modellen er rent semantisk. Rent mental. Den udtrykkes i form at et diagram. Er diagrammet er ikke særligt rigoristisk formelt. Der er et par stilarter, der dog ofte blandes i praksis.

Når ER modellen er diskuteret på plads mellem rekvirent og udvikler, skal den transformeres til en logisk model, der kan implementeres fysisk. Den logiske manifestation af datamodellen udføres i den relationelle datamodels operationelle sprog SQL. Structured Query Language er et deklarativt programmeringssprog standardiseret af ISO. I SQL beskrives ER modellens objekter som tabeller og attributter underlagt nogle regler.

Designkriterier

Vi har to overordnede designkriterier, der frem for alle andre overvejelser skal genfindes i de datamodeller vi udarbejder. Overtrædelse af disse grundlove bringer os på kant med det, at databasen skal være et sandt udsagn om en virksomheds virkelighed. Man plejer at sige sandheden, hele sandheden, og intet andet end sandheden. Grunden til at disse designkriterier nævnes allerede nu, er at hvis de ikke indgår i overvejelserne allerede på modelleringstidspunktet, risikerer vi senere at realisere databasen ud fra en defekt model. Der findes værktøjer, der kan afsløre dette, men da projekter i virkelighedens verden af og til har fart på, er det ikke altid disse værktøjer når at komme i anvendelse. En anden grund kan være, at designeren er overbevist om modellens kvalitet og derfor ikke på grund af hastværk, men på grund af selvtilstrækkelighed glemmer at kvalitetssikre. Det gælder selvfølgelig ikke os, men nogle andre. Vi vil derfor alligevel kaste et kort blik på de to problemområder.

Problem: Null

Se på følgende tabel læst og udskrevet fra en databasetabel:

MariaDB [db5]> select * from t41;
+------------------+--------+------------+----------------+
| fag              | laerer | uddannelse | antallektioner |
+------------------+--------+------------+----------------+
| Interaktion      | Niels  | MDU        |             81 |
| Databaser        | Niels  | MDU        |           NULL |
| Design           | Bror   | MDU        |           NULL |
| Kommunikation    | Bror   | NULL       |             54 |
| Multimedier      | Bror   | NULL       |           NULL |
| Interaktion 2    | NULL   | MDU        |             81 |
| Interaktion 3    | NULL   | NULL       |           NULL |
| Interaktion Afsl | NULL   | NULL       |           NULL |
+------------------+--------+------------+----------------+
8 rows in set (0.00 sec)

MariaDB [db5]>

Null er ingenting. Dett kommer til udtryk som mangel på data. Hvor er så problemet herover? Hvis der er et problem, hvorfor er det et problem? Er nulls altid et problem?

Som et hint vises her et antal optællinger af antal rækker i den pågældende tabel:

MariaDB [db5]> select count(fag) from t41;
+------------+
| count(fag) |
+------------+
|          8 |
+------------+
1 row in set (0.01 sec)

MariaDB [db5]>
MariaDB [db5]> select count(laerer) from t41;
+---------------+
| count(laerer) |
+---------------+
|             5 |
+---------------+
1 row in set (0.00 sec)

MariaDB [db5]>
MariaDB [db5]> select count(uddannelse) from t41;
+-------------------+
| count(uddannelse) |
+-------------------+
|                 4 |
+-------------------+
1 row in set (0.00 sec)

MariaDB [db5]> 
MariaDB [db5]> select count(antallektioner) from t41;
+-----------------------+
| count(antallektioner) |
+-----------------------+
|                     3 |
+-----------------------+
1 row in set (0.00 sec)

MariaDB [db5]> 

Nu ved vi hvor mange der er! Hvad er så det gennemsnitlige antal lektioner per fag:

MariaDB [db5]> select avg(antallektioner) from t41;
+---------------------+
| avg(antallektioner) |
+---------------------+
|             72.0000 |
+---------------------+
1 row in set (0.00 sec)

MariaDB [db5]>

Det må vi lige se per uddannelse

MariaDB [db5]> select uddannelse, avg(antallektioner) from t41 group by uddannelse;
+------------+---------------------+
| uddannelse | avg(antallektioner) |
+------------+---------------------+
| NULL       |             54.0000 |
| MDU        |             81.0000 |
+------------+---------------------+
2 rows in set (0.01 sec)

MariaDB [db5]>

Hm? Sandt udsagn?

Problem: Redundans

Se på følgende tabel læst og udskrevet fra en databasetabel:

MariaDB [db5]> select klasse, studid, fag, karakter, semester, laerer, stilling
from t42
order by studid, semester;
+--------+--------+-------------+----------+----------+--------+--------------+
| klasse | studid | fag         | karakter | semester | laerer | stilling     |
+--------+--------+-------------+----------+----------+--------+--------------+
| 07B    |      1 | Interaktion |        4 |        1 | Niels  | Underviser   |
| 07B    |      1 | Interaktion |        4 |        2 | Niels  | Handelsoverl |
| 07B    |      1 | Interaktion |        4 |        3 | Niels  | Lektor       |
| 07B    |     21 | Interaktion |        4 |        1 | Niels  | Lektor       |
| 07B    |     21 | Interaktion |        4 |        2 | Niels  | Lektor       |
| 07B    |     21 | Interaktion |        4 |        3 | Niels  | Lektor       |
| 07B    |     22 | Interaktion |        2 |        1 | Niels  | Lektor       |
| 07B    |     22 | Interaktion |        2 |        2 | Niels  | Lektor       |
| 07B    |     22 | Interaktion |        2 |        3 | Niels  | Lektor       |
| 07B    |     23 | Interaktion |        7 |        1 | Niels  | Lektor       |
| 07B    |     23 | Interaktion |        2 |        2 | Niels  | Professor    |
| 07B    |     23 | Interaktion |       -3 |        3 | Niels  | Lærer        |
+--------+--------+-------------+----------+----------+--------+--------------+
12 rows in set (0.00 sec)

MariaDB [db5]>

Redundans er her overflødig gentagelse af data. Hvor er så problemet herover? Hvis der er et problem, hvorfor er det et problem? Er gentagelse af data altid et problem?