Database Model: Bordspellen
Technisch ontwerp voor een bordspel-catalogus (Rood Thema)
1. Overzicht van het model
2. DDL – Tabeldefinities (SQL)
A. Tabellen: Stamgegevens
SQL
-- Tabel voor de uitgevers van de spellen
CREATE TABLE uitgever (
uitgever_id INT AUTO_INCREMENT PRIMARY KEY,
naam VARCHAR(50) NOT NULL,
website_url VARCHAR(255)
);
-- Tabel voor de categorieën
CREATE TABLE categorie (
categorie_id INT AUTO_INCREMENT PRIMARY KEY,
naam VARCHAR(50) NOT NULL
);
B. Tabel: product (De Kern)
SQL
CREATE TABLE product (
product_id INT AUTO_INCREMENT PRIMARY KEY,
naam VARCHAR(100) NOT NULL,
omschrijving TEXT,
prijs DECIMAL(10,2) NOT NULL,
voorraad INT DEFAULT 0,
aangemaakt_op DATETIME DEFAULT CURRENT_TIMESTAMP,
bijgewerkt_op DATETIME ON UPDATE CURRENT_TIMESTAMP,
uitgever_id INT,
FOREIGN KEY (uitgever_id) REFERENCES uitgever(uitgever_id)
);
C. Tabellen: Afbeeldingen & Koppelingen
SQL
-- Voor meerdere afbeeldingen per bordspel
CREATE TABLE product_afbeelding (
product_afbeelding_id INT AUTO_INCREMENT PRIMARY KEY,
bestand_pad VARCHAR(255) NOT NULL,
alt_tekst VARCHAR(255),
volgorde INT DEFAULT 0,
is_hoofd BOOLEAN DEFAULT FALSE,
product_id INT,
FOREIGN KEY (product_id) REFERENCES product(product_id) ON DELETE CASCADE
);
-- Koppeltabel voor de Many-to-Many relatie
CREATE TABLE product_categorie (
product_id INT,
categorie_id INT,
PRIMARY KEY (product_id, categorie_id),
FOREIGN KEY (product_id) REFERENCES product(product_id) ON DELETE CASCADE,
FOREIGN KEY (categorie_id) REFERENCES categorie(categorie_id)
);
3. Voorbeeld Data
De voorbeelddata toont hoe Catan en Monopoly over meerdere tabellen zijn verdeeld.
Tabel: uitgever
| uitgever_id | naam | website_url |
|---|---|---|
| 1 | 999 Games | https://www.999games.nl |
| 2 | Hasbro | https://shop.hasbro.com |
Tabel: product
| product_id | naam | prijs | voorraad | uitgever_id |
|---|---|---|---|---|
| 1 | Catan | 34.95 | 150 | 1 |
| 2 | Monopoly | 29.99 | 200 | 2 |
Tabel: categorie
| id | naam |
|---|---|
| 1 | Strategie |
| 2 | Familie |
| 3 | Klassieker |
Tabel: product_categorie (Koppelingen)
| product_id | categorie_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
4. Handige Views
View A: v_volledig_product_overzicht
Deze view toont per spel de hoofdafbeelding, naam, uitgever, categorieën, prijs en voorraad in één regel.
SQL
CREATE VIEW v_volledig_product_overzicht AS
SELECT
a.bestand_pad AS hoofd_afbeelding,
p.naam AS spel_naam,
u.naam AS uitgever,
GROUP_CONCAT(DISTINCT c.naam SEPARATOR ', ') AS categorien,
p.prijs,
p.voorraad
FROM product p
LEFT JOIN uitgever u ON p.uitgever_id = u.uitgever_id
LEFT JOIN product_categorie pc ON p.product_id = pc.product_id
LEFT JOIN categorie c ON pc.categorie_id = c.categorie_id
LEFT JOIN product_afbeelding a ON p.product_id = a.product_id AND a.is_hoofd = TRUE
GROUP BY p.product_id, a.bestand_pad, p.naam, u.naam, p.prijs, p.voorraad;
| hoofd_afbeelding | spel_naam | uitgever | categorien | prijs | voorraad |
|---|---|---|---|---|---|
| catan_boxart.jpg | Catan | 999 Games | Strategie, Familie | 34.95 | 150 |
| monopoly_main.png | Monopoly | Hasbro | Familie, Klassieker | 29.99 | 200 |
View B: v_product_afbeeldingen_overzicht
Deze view toont alle afbeeldingen per spel. Je ziet direct het bestand, de alt-tekst, de hoofdafbeelding en de volgorde.
SQL
CREATE VIEW v_product_afbeeldingen_overzicht AS
SELECT
p.naam AS spel_naam,
pa.bestand_pad,
pa.alt_tekst,
pa.is_hoofd,
pa.volgorde
FROM product_afbeelding pa
JOIN product p ON pa.product_id = p.product_id;
| spel_naam | bestand_pad | is_hoofd | volgorde |
|---|---|---|---|
| Catan | catan_boxart.jpg | TRUE | 1 |
| Catan | catan_bord.jpg | FALSE | 2 |
5. Belangrijke Details
- GROUP_CONCAT: Voegt meerdere categorieën samen tot één veld.
- Foreign keys: Bewaken de relaties tussen de tabellen.
- ON DELETE CASCADE: Verwijdert gekoppelde records automatisch mee.