10 Structures de données (2) - damiencorpataux/infradon1 GitHub Wiki

Héritage

Voici un exemple pour illustrer l'utilisation de l'héritage dans une base de données. Nous allons construire une structure de données minimaliste pour une application de gestion de tâches (todo list).

Dans cet exemple d'application, nous aurons deux types de tâches : les tâches simples et les tâches récurrentes. Les tâches récurrentes peuvent avoir des propriétés supplémentaires par rapport aux tâches simples.

Modèle de données

-- Création de la table de base "tasks"
CREATE TABLE tasks (
    task_id SERIAL PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    description TEXT,
    due_date DATE,
    completed BOOLEAN DEFAULT FALSE
);

-- Création de la table pour les tâches récurrentes, qui hérite de "tasks"
CREATE TABLE recurring_tasks (
    interval INTEGER NOT NULL
) INHERITS (tasks);

Données

Population de données de test

-- Ajout d'une tâche simple
INSERT INTO tasks (title, description, due_date) 
VALUES ('Faire les courses', 'Acheter des fruits et légumes', '2024-04-25');

-- Ajout d'une tâche récurrente
INSERT INTO recurring_tasks (title, description, due_date, interval) 
VALUES ('Aller à la gym', 'Entraînement cardio', '2024-04-24', 7);

Interrogation des données

-- Sélectionner toutes les tâches (y compris les tâches récurrentes)
SELECT * FROM tasks;

-- Sélectionner les tâches récurrentes
SELECT * FROM recurring_tasks;

-- Sélectionner les tâches simples (non-récurrentes)
SELECT * FROM tasks WHERE task_id NOT IN (SELECT task_id FROM recurring_tasks);

-- Sélectionner toutes les tâches simples et récurrentes avec leur type
SELECT *, NULL as interval, 'simple' AS task_type FROM tasks
UNION ALL
SELECT *, 'recurring' AS task_type FROM recurring_tasks;

Avantages de l'héritage

L'utilisation de l'héritage dans ce cas présente plusieurs avantages:

Partage de la structure de base

Les tâches récurrentes partagent de nombreuses caractéristiques avec les tâches simples, telles que le titre, la description et la date d'échéance. En utilisant l'héritage, nous évitons la duplication de ces colonnes dans la table des tâches récurrentes.

Requêtes simplifiées

L'héritage nous permet de sélectionner toutes les tâches, qu'elles soient simples ou récurrentes, en une seule requête, simplifiant ainsi le processus d'interrogation de la base de données.

Évolutivité

Si de nouveaux types de tâches nécessitant des propriétés supplémentaires sont ajoutés à l'avenir, nous pouvons simplement créer de nouvelles tables héritant de la table de base des tâches, ce qui facilite l'extension du schéma de base de données sans avoir à modifier les tables existantes - donc en héritant simplement d'une table existante.

A l'inverse, si nous voulons modifier des colonnes pour tous les types tâches, nous pouvons modifier ces colonnes à la table de base des tâches. Toutes les tables héritant la table de base tasks hériteront de la modification. Par exemple: ALTER TABLE tasks DROP COLUMN completed et voyez \d tasks.

Intégrité référentielle

En utilisant l'héritage, nous pourrions définir une relation de clé étrangère entre la table des tâches récurrentes et la table des tâches simples. Cela garantirait que chaque tâche récurrente a une correspondance avec une tâche simple parente.

Essayez ALTER TABLE tasks ADD COLUMN parent_task_id INT REFERENCES tasks(task_id) ON DELETE CASCADE et créez les différentes tâches filles possibles - c-à-d référençant un enregistrement de tasks ou recurring_tasks.

Créez la requête SELECT qui permet d'afficher les taches parentes et leur tâches filles, peut-être en utilisant LEFT JOIN ?

Résumé

L'utilisation de l'héritage dans ce cas offre une modélisation efficace et flexible des données, en permettant la réutilisation des la structures de base, tout en permettant l'extension facile du schéma de base de données.