---
title: Conception de la Base de Données
description: MCD, MLD et MPD de MemeGoat.
---

## Modèle Conceptuel des Données (MCD)
Le MCD définit les entités et leurs relations.

```mermaid
erDiagram
    UTILISATEUR ||--o{ MEME : "crée"
    UTILISATEUR ||--o{ COMMENTAIRE : "écrit"
    MEME ||--o{ COMMENTAIRE : "reçoit"
    MEME }o--o{ TAG : "possède"

    UTILISATEUR {
        string pseudo
        string email
        string mot_de_passe
        datetime date_creation
    }
    MEME {
        string titre
        string url_image
        datetime date_creation
    }
    TAG {
        string nom
    }
    COMMENTAIRE {
        string contenu
        datetime date_creation
    }
```

## Modèle Logique des Données (MLD)
Le MLD traduit le MCD en tables avec les clés étrangères.

```mermaid
erDiagram
    users ||--o{ memes : "user_id"
    users ||--o{ comments : "user_id"
    memes ||--o{ comments : "meme_id"
    memes ||--o{ meme_tags : "meme_id"
    tags ||--o{ meme_tags : "tag_id"

    users {
        uuid id PK
        varchar username
        varchar email
        text password_hash
        timestamp created_at
    }
    memes {
        uuid id PK
        varchar title
        text image_url
        uuid user_id FK
        timestamp created_at
    }
    tags {
        uuid id PK
        varchar name
    }
    meme_tags {
        uuid meme_id FK
        uuid tag_id FK
    }
    comments {
        uuid id PK
        text content
        uuid user_id FK
        uuid meme_id FK
        timestamp created_at
    }
```

## Modèle Physique des Données (MPD)
Implémentation SQL pour PostgreSQL.

```sql
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash TEXT NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE memes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    title VARCHAR(255) NOT NULL,
    image_url TEXT NOT NULL,
    user_id UUID REFERENCES users(id) ON DELETE SET NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE tags (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE meme_tags (
    meme_id UUID REFERENCES memes(id) ON DELETE CASCADE,
    tag_id UUID REFERENCES tags(id) ON DELETE CASCADE,
    PRIMARY KEY (meme_id, tag_id)
);

CREATE TABLE comments (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    content TEXT NOT NULL,
    user_id UUID REFERENCES users(id) ON DELETE SET NULL,
    meme_id UUID REFERENCES memes(id) ON DELETE CASCADE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
```
