Database Model: Bordspellen

Technisch ontwerp voor een bordspel-catalogus (Rood Thema)

1. Overzicht van het model

Het diagram toont de opbouw van de database. De tabel product staat centraal en bevat de basisgegevens van elk bordspel.

Een uitgever kan meerdere producten hebben. Een product kan in meerdere categorieën vallen. Daarom gebruikt het model de koppeltabel product_categorie.

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
1Strategie
2Familie
3Klassieker

Tabel: product_categorie (Koppelingen)

product_id categorie_id
11
12
22
23

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.