Bonjour à tous,
Etant en pleine conception de base de données, je me retrouve, avec mon équipe, confronté à un dilemne.
Cette discussion fait suite à la lecture de cette discussion très intéressante !
Je vais donc essayer d'exposer mon problème en version simplifiée et les différentes solutions auxquelles nous avons pensé.
Donc je modélise un schéma de base pour une refonte d'appli gérant les interventions dans des résidences. Les interventions peuvent avoir lieu sur un appartement, un couloir (lot d'appartements), un étage ou un bâtiment. Les résidences peuvent avoir plusieurs bâtiments. Les appartements ont un type ainsi que les couloirs (rien à voir entre les 2 types).
Voilà en gros la partie qui me pose souci, sachant que les appartements, les couloirs et les étages ont des informations communes (superficie...), mais que les bâtiments en ont d'autres (syndic, adresse).
Et les solutions auxquelles nous avons pensé, et attention, il y en a de très mauvaises :
- Solution en place sur l'outil actuel : 4 tables Appartement, Couloir, Etage et Batiment, chacune étant lié à celle "du dessus" en terme d'appartenance avec des clés étrangères. A la création d'un bâtiment, création d'un étage dit "Tous" qui correspond fonctionnellement à tous les étages de ce bâtiment. A la création d'un étage, création d'un couloir dit "Tous" et pareil pour les appartements. Ensuite, ma table Intervention ne pointe que vers Appartement avec une clé étrangère, et si une intervention a lieu pour un étage, on pointe donc vers l'Appartement Tous du couloir Tous de l'étage concerné.
Avantage : une seule clé étrangère sur Intervention (et encore, pas convaincu)
Inconvénient : un nombre d'entrées énorme pour les Appartements quand on commence à multiplier les bâtiments/étages/couloir (entre autres)
- Solution pensée 1 : toujours les 4 tables pour chaque granularité de lieu (Appartement, Couloir, Etage et Batiment), chacune étant toujours liée à celle "du dessus", mais la table Intervention a 4 clés étrangères vers chacune des lieux, et une et une seule n'est renseignée.
Avantage : le nombre d'enregistrements qu'il faut, pas plus.
Inconvénient : beaucoup de null dans la table Intervention
- Solution pensée 2 : après lecture de la discussion en tête de ce message, création d'une table Lieu avec une autre Type_lieu (Appartement, Couloir, Etage, Bâtiment). La table Lieu a 3 clés étrangères pour gérer les id_lieu_couloir, l'id_lieu_etage et l'id_lieu_batiment pères éventuels.
Avantage : une seule table
Inconvénient : beaucoup de null là aussi dans les id_pere éventuels
- Solution pensée 3 : une évolution de la précédente, avec une seule clé étrangère pour gérer le père direct, et pas tous les ascendants. Un appartement ne pointe que vers un couloir, ce couloir pointe vers l'étage...
Avantage : l'id est null juste pour les bâtiments
Inconvénients : un peu galère pour afficher, pour une intervention, le lieu complet (les 4 informations).
- Solution pensée 3bis : une évolution encore de la précédente. Pour l'instant, on considère que la table Lieu contient tous les détails des lieux. Là, on partirait sur une table Détail_Appartement_Couloir_Etage avec les détails communs à ces 3 lieux, et une table Détail_batiment qui contient les détails des batiments uniquement. Ces 2 tables pointeraient vers Lieu.
Avantage : encore une fois, moins de null dans la base, puisque chaque table a des enregistrements "complets" puisqu'avec des données qui la concerne uniquement.
Inconvénient : là encore, on multiplie les tables, et la remontée des infos me parait complexe (à première vue). Puis quid des Type_Appartement et Type_Couloir ?
Voilà donc le point sur notre réflexion. Pour info, on part sur du SQL Server ou de l'Oracle (choix laissé aux clients).
Merci par avance à ceux qui pourront éclairer notre lanterne, nous souhaitons quand même partir sur des bases solides
Partager