|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Bonjour,
Je suis actuellement en train de faire l'analyse d'un projet et je me pose une question au niveau de la conception de la DB. N'étant absolument pas DBA mais devant tout de même occupé cette fonction, je me tourne vers vous... Ce qui suit décrit l'application, pour passer directement à la question, sautez le passage [NOTE]. [NOTE] Pour situer un peu le contexte, il s'agit d'un projet destiné à gérer des entretiens "d'évolution" (d'évaluation en fait mais bon... ils ont appelé ça évolution^^). Donc en gros, le supérieur s'entretien avec son subalterne puis après, reporte le contenu de l'entretien dans une application afin d'avoir un rapport. Dans l'application, il devra mentionner la personne concernée par cet entretien et sa fonction. Une fois la fonction choisie, le programme ira lui chercher les compétences qu'il faut évaluer pour cette fonction. Ces dernières sont organisées en groupe. [/NOTE] Pour le moment, j'ai donc une table TblEvoGroupe comme suit : Code :
Ensuite j'ai la table TblEvoCompetence comme suit : Code :
Est-il possible d'établir une relation entre ces deux tables en sachant que le champ IdGroupe de la table TblEvoGroupe ne sera pas unique ? Faut-il scinder cette table en 2 avec dans une, uniquement l'id du groupe et les champs de tracking et dans l'autre, les différentes traductions ? De cette manière j'aurai bien l'id de groupe qui sera unique pour servir de clef étrangère dans la table des compétences mais il y a peut-être une autre manière de faire... NB : Une compétence ne peut appartenir qu'à un seul groupe. Qu'en pensez-vous ? Griftou. |
||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Il faudrait nous en dire plus sur le sens des différents attributs.
Je suis étonné par exemple de voir que les attributs IdLanguage, IdGroupe et Version sont présents dans les deux entités. Aussi, je suis étonné de voir Id et IdComp dans l'entité des compétences : l'identifiant d'une compétence n'est-il pas unique ? Idem pour l'entité des groups : on a déjà idgroup : à quoi sert le id ? Si la langue et la version sont là pour apporter des traductions (et évolutions des traductions) alors ils doivent être dans deux entités alternatives "historique" et "traduction". Sinon, ça va être la croix et la banière. D'autant que "organisation" est la même compétence que ce soit en français, chinois ou russe : à partir de là, il faut bel et bien un identifiant unique quelle que soit la langue, et utiliser cet identifiant comme clé étrangère, et non un id arbitraire comme tu as l'air de désirer faire. |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Ok,
A la base, j'avais fait une table TblEvoCompetence et une table TblEvoCompetenceTrad. Dans la première, uniquement un Id et des champs de tracking (createdOn, modifiedOn, createdBy et modified By) et le reste des champs dans la seconde (avec aussi des champs de tracking. Mais vu que je n'avais comme données significatives que le champ Id dans la première table, cela me semblait bizarre... Par contre, si je comprends bien ton explication, tu ferais une 3e table pour contenir les anciennes versions ? Est-ce bien cela ? Griftou. |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
En fait, ça dépend de ce que tu entends par "version".
Puisque la table des compétentes ne contient qu'un champ ID plus des dates de création/modification, je ne pense pas qu'il soit intéressant de gérer une version sur ces données. On a donc une version sur les traductions. Et à ce moment : à quoi sert cette version ? Pouvoir consulter le nom de la compétence l'an dernier ? (est-ce utile ?) Si oui, alors personnellement, afin de ne pas alourdir la base, je rajouterais une table, dans laquelle je recopierais la donnée modifiée de la table de traduction, en mettant la date à laquelle le libellé historisé à été remplacé. En effet, ce qui importe dans 99% des cas, c'est le nom de la compétence "là maintenant tout de suite", donc c'est domage de devoir faire des max() ou des filtres sur des dates dans tous les sens pour récupérer le dernier libellé, alors que l'utilité des libellés historisé est limitée. Si c'était des tarifs par exemple, ce ne serait pas la même chose : il faut, dès qu'on gère une commande portant sur une date précise, retrouver les tarifs applicables à cette date, que ce soit les tarifs actuels ou ceux d'il y a 10 jours. Donc là, une plage de date d'application est pertinante. Dans tous les cas un entier pour gérer une version me semble superflu : perte d'information par rapport à une date, et moins pratique à utiliser. |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Le truc, c'est que donc, dans le contexte de l'application, l'utilisateur va encoder dans l'application une sorte de rapport d'entretien d'évaluation.
Si un an plus tard, on veut réimprimer ce rapport, je dois pouvoir retrouver le texte de la compétence tel qu'il était à ce moment là. J'ai donc aussi une autre table que j'avais prévue comme ceci : TblEvoNotation: Code :
Certes l'application permettra d'importer un document au format pdf pour réimpression mais, au cas où, j'aimerais pouvoir recréer le document à la volée. Je sauvegarde donc les notes accordées à chaque compétence et la version de la compétence en question. Après si c'est mieux de mettre une date plutot qu'un entier, soit. C'est un autre débat (qui m'intéresse fortement !!) Est-ce plus cohérent/clair ? Griftou. |
||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Si vous modélisiez au niveau CONCEPTUEL et non PHYSIQUE vous verriez immédiatement les nombreuses erreurs de votre modèle à commencer par le nom des attributs des entités qui est absurde !
En effet une règle de modélisation veut que chaque attribut possède un nom unique dans le SI (norme AFNOR). Par exemple l'attribut version se trouve dans les deux tables et devrait donc contenir les mêmes informations et servir à une clef étrangère d'une table envers l'autre, ce qui je suppose n'est pas le cas... Donc il faudrait avoir deux nom différents, par exemple GRP_VERSION et CPT_VERSION. Sinon cela vous empêchera par exemple de faire des jointures naturelles. A contrario, le fait d'avoir une clef étrangère dans une table, fait que la ou les attributs devraient porter les mêmes noms dans les différentes tables. Ainsi on devrait avoir par exemple GRP_ID dans les deux tables et non ID dans la table des groupe et ID_GROUPE dans l'autre ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#7 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Certes, je ne peux pas vous donner tort.
Mais il ne s'agit là que de convention de nommage. Même si les champs s'appelaient bidule et truc, cela devrait tout aussi bien fonctionner. Ce ne serait pas clair/lisible mais cela fonctionnerait. Ce n'est peut-être pas la meilleure approche mais je préfère d'abord m'intéresser au problème d'un point de vue fonctionnel plutôt que d'un point de vue formel. |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
J'abonde tout de même dans l'approche de SQLPro : quand l'aspect formel est clair, alors le reste est généralement bien plus simple.
Tu le dis toi même : si c'est mal nommé, c'est pas clair. La conceptualisation devient donc rapidement une prise de tête alors que la problématique peut être triviale, seulement l'obscurité du nommage nous empêche de trouver les solutions qui sautent aux yeux. |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Comme je l'ai dit, j'abonde aussi dans son sens.
C'est juste que son message n'apportait aucune clarification à la question du nombre de table nécessaire dans le cas présenté. Il est certain qu'au final, je tâcherai d'y apporter toute la clarté nécessaire. Mais dans un premier temps, je souhaite arriver à une solution fonctionnelle. @StringBuilder : Est-ce que mes précisions vous ont éclairé concernant le champ Version ? |
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Dans ce cas et comme je vous l'ai déjà dit, commencez par une modélisation conceptuelle (entités et association) et non avec des tables physiques...
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#11 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
C'est ce que je pensais faire
.Je dois probablement faire un amalgame des deux. Je ne suis DBA que par la force des choses... Je fais avec mes maigres connaissances. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com