Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/12/2011, 10h34   #1
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
Par défaut Question sur les clefs étrangères

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 :
1
2
3
4
5
6
Id int NOT NULL identity(1,1) PK
IdGroupe int NOT NULL
IdLanguage int NOT NULL
Version int NOT NULL
Name varchar(150) NOT NULL
--divers champs de tracking
Déjà là, se pose la question de savoir s'il est préférable de choisir une clef primaire composée plutôt que d'ajouter un champ auto incrémenté.

Ensuite j'ai la table TblEvoCompetence comme suit :
Code :
1
2
3
4
5
6
7
Id int NOT NULL identity(1,1) PK
IdComp int NOT NULL
IdLanguage int NOT NULL
IdGroupe int NOT NULL
Version int NOT NULL
Texte varchar(1000) NOT NULL
--divers champs de tracking
La question que je me pose est :
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.
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 13h21   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 15h30   #3
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
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.
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 17h08   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 18h15   #5
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
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 :
1
2
3
4
5
6
 
id int identity(1,1) PK
idComp int FK
VersionComp int
Note int
--divers champs de tracking
Qqch comme ça (je suis chez moi et je n'ai pas le document d'analyse sous les yeux).
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.
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2012, 11h17   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 09h18   #7
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
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.
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 10h59   #8
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 11h15   #9
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
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 ?
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h38   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par griftou Voir le message
... je souhaite arriver à une solution fonctionnelle
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h45   #11
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur
Inscription : juillet 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 307
Points : 1 019
Points : 1 019
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.
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h25.


 
 
 
 
Partenaires

Hébergement Web