Je n'ai pas pu me pencher sur ton bidule dans la journée, mais j'ai pris un peu de temps ce soir.
Voici un schéma sur lequel on devrait pouvoir travailler et avancer en précisant certains points.
Je n'ai pas proposé de vues (views) pour l'instant, c'est bien trop tôt tant que le squelette n'a pas tous ses os et leurs articulations.
Ouvre Expert, crée une base EMC.db3 avec une taille de page de 4096, ouvre un onglet SQL et colle-moi ça dedans. Un coup de F5 (Execute SQL) et ça te crée l'ensemble à l'identique.
J'ai suivi grosso modo tes spécifications, sauf qu'on ne stocke jamais une liste dans une table (e.g. liste des experts par service). Il y a une table de base "Services" et une table "Intervenants" qui elle contient un identifiant de Service pour chaque expert. Une telle relation emploie des clés étrangères (Foreign Keys) qui sont des identifiants "pointant" vers d'autres tables. Si par exemple un expert pouvait faire partie de plusieurs services, il faudrait impérativement passer par une autre table liant chaque intervenant à chaque service où il est susceptible d'apporter son concours.
Tout dépend du type de relation qu'il s'agit de modéliser entre deux entités. Si relation bijective (1 à 1) on peut mettre les deux entités dans la même table, sauf si d'autres raisons en dissuadent. Si relation de 1 à N (projet --> documents), on doit avoir deux tables : Projets et Documents, cette dernière contenant un identificateur (clé étrangère ou FK) le liant à un projet unique.
Une règle simple permet de s"y retrouver : les tables qui n'ont qu'un identifiant et aucune clé étrangère sont des tables de base. Les autres sont des tables sous-tendant des relations plus complexes, comme exposé ci-dessus.
Les clés étrangères (FK dans tout ce qui suivra) sont la grande force de SQL, qui repose sur un modèle très proche de la théorie des ensembles. Un des grands principes directeurs est d'éviter toute duplication d'information (données identiques ayant la même valeur sémantique dans plusieurs tables), sauf gros problème de performance identifié. C'est pour celà qu'il n'y a pas de table Projet --> Services, car on dispose d'une table Projet --> Intervenants et dans Intervenants figure une FK vers le service auquel chaque expert appartient.
Dans les requêtes SQL, on relie les tables par des jointures (JOIN) et autant il serait impensable de travailler à la main avec des fiches portant le numéro d'autres fiches d'autres Rollodex, autant ce mécanisme de jointure est quelque chose de parfaitement normal pour tout moteur de BDD et là où il excelle (sans jeu de mots) en terme d'efficacité. Le (léger) désavantage est qu'on est amené à formuler des requêtes à rallonge, mais ce n'est rien à côté de la puissance offerte en retour par l'engin et de la garantie d'intégrité obtenue.
Il faut, à la création, d'une FK se poser une question primordiale : que doit-on faire si l'on modifie ou supprime l'entrée parent ? Devra-t-on modifier/supprimer l'entrée fille, la laisser orpheline, la mettre à NULL (valeur signifiant "Je ne sais pas"), ... SQL et SQLite permettent d'effectuer ces opération automatiquement, garantissant ainsi la cohérence de la base.
Si je supprime un client, il est logique de supprimer ses projets (clause ON DELETE CASCADE sur la FK clientprojet), mais ce faisant, on a des FK dans les projets, vers les documents. Qu'on supprime aussi les entrées Document de ces projets est logique.
Par contre, si on change un jour le périmètre d'activité des services et qu'on est amené à en supprimer un, on ne va peut-être pas supprimer les intervenants qui en faisaient partie. La clause ON DELETE SET DEFAULT va utiliser la valeur par défaut que j'ai défini (0) et il faut donc disposer d'un service bidon avec Id = 0 ayant pour nom "En instance d'affectation". Idem dans le cas de la suppression d'un responsable de service : dans la table service le ResponsableId va passer à 0 et cet pseudo-intervenant a pour nom : "Poste à pourvoir".
J'ai aussi spécifié quelques contraintes d'unicité, du moins celles qui semblaient évidentes. D'autres contraintes de validité ou de cohérence viendront plus tard. Ne jamais créer d'index de données avant d'identifier un véritable problème de performance.
Toujours définir les identifiants primaires en INTEGER, pas en INT ou autre. La distinction est importante dans ce cas-là uniquement.
J'ai mis plus de temps à rédiger ce pavé de texte qu'à constituer la base (merci Expert), donc attends-toi a quelques énormités et/ou omissions dans ce premier jet.
Selon les besoins il faudra peut-être ajouter une table des états d'avancement s'ils sont formalisés, ou en changer le type (pourcentage par exemple).
Ne modifie rien pour l'instant, fais-moi juste remonter tes remarques et questions. Ne t'affole pas devant le nombre de tables : il n'y a pas lieu (à mon avis) de prévoir une interface pour chacune. En effet, tu ne crées peut-être pas des services tous les jours, donc il te suffira d'utiliser Expert pour ça. Mon expérience personnelle me pousse à dire que sauf besoin vraiment programmatique tu pourrais même te passer entièrement d'applicatif et n'utiliser qu'Expert, mais on en reparlera quand le schéma se solidifiera.
Dernière chose : je souhaite bien du plaisir à qui ferait ça sous Excel, piloté par AutoIt ou pas.



