Bonjour,
J'ai un doute sur comment structurer les tables de ma base de données, et je pense que c'est un problème relativement fréquent mais je ne suis pas parvenu à trouver un tuto ou un "guide de bonnes pratiques" à ce sujet.
J'ai d'un côté des tables décrivant des objets physiques (des équipements, des accessoires, des cylindres, etc.) et de l'autre côté, des lieux (chez le fournisseur, dans un laboratoire, dans une station, sur un site mobile, etc.)
Les objets physiques ont des caractéristiques suffisamment différentes pour que la question de leur factorisation ne se pose pas : ils ont chacun leur table.
Par contre, les lieux ont beaucoup en commun (coordonnées GPS, altitude, adresse, numéros de téléphone). Ils ont également certaines différences, soit dans les colonnes (j'ai besoin de définir un champ "code d'accès" pour les stations mais pas pour les autres lieux, par exemple), soit par les relations qu'ils ont avec les objets physiques (expl : un cylindre peut aller partout, sauf chez un fournisseur).
De plus, je veux tracer les positions successives de mes objets, donc il me faut une table de liaison entre un objet et le lieux pour stocker la date d'entrée et de sortie d'un objet dans un lieux.
La question est donc : quelle est la meilleur méthode pour gérer ça ?
1. Factoriser : je crée une table "Lieux" plus ou moins générique, qui contient les champs communs à tous les lieux.
Je crée des tables fournisseur, laboratoire, station, etc. qui auront pour clé étrangère le Lieux qui correspond.
Tous mes objets physiques sont "branchés" sur la table Lieux.
Si je veux avoir des informations complètes sur un lieu particulier, je recompose mon lieux à partir des informations de ma table Lieux et de la table spécifique qui correspond (Fournisseur, Laboratoire, etc.).
Dans ma table "Lieux", j'ajoute un champ ENUM('fournisseur', 'laboratoire', ...) pour faciliter les requêtes : vu que je sais quel type de lieu c'est, je peux aller piocher directement dans la bonne table sans devoir tous les parcourir, à la recherche de celle qui contient la clé étrangère qui m'intéresse.
2. Une table par lieu.
Il faut dupliquer les colonnes communes et multiplier les tables de liaisons (s'il y a "n" types de lieux et "m" types d'objets, il y aura n*m tables de liaisons avec la solution 2 alors qu'il n'y en aura que "m" avec la solution 1)
Qu'en pensez-vous ?
Du point de vue de la base de données, la solution 1 semble la meilleure, mais du point de vu de l'application, la 2 semble la plus simple, il n'y a pas besoin de courir après les tables spécifiques de lieux pour savoir à quoi correspond le Lieux ; on n'a plus cette "coquille vide" (ou abstraite) qu'est la table "Lieux".
Quelle est la bonne pratique dans ce cas ?
Merci !
Partager