Relation à l'envers : c'est moi qui suis limité, ou l'auteur qui est cinglé ?
Bonjour,
Je viens vers vous, car je travaille sur un outil qui me laisse de plus en plus perplexe.
Il s'agit d'un logiciel éditeur. J'essaie de mettre en place certaines fonctionnalités, non sans mal, et j'ai vraiment du mal avec certains choix des développeurs.
Vu que je ne peux me résoudre à admettre qu'ils sont complètement 3 lettres (enfin, 4 au pluriel) je me dis que c'est peut-être moi qui ai raté un wagon... Dénormalisation ?
Voici l'exemple qui m'afflige le plus.
J'ai une entité "produit".
Une autre entité "texte".
Bon, déjà, c'est un peu bancal, car "texte" contient des traduction d'un peu tout et n'importe quoi, avec différentes méthodes pour faire les relations... selon les entités avec lesquelles elle est liée.
Au niveau table, voici les colonnes :
PRODUIT
----------
ID (PK)
NOM (langue de base)
TEXTE_ID => FK vers TEXTE (ID2)
TEXTE
-------
ID (PK)
LANGUE_ID (PK)
ID2 FK vers TEXTE (ID)
TRADUCTION
Evidement, les FK sont purement logiques, niveau base de données, elles n'existent pas (et ne pourraient de toute façon pas, puisque ni TEXTE.ID ni TEXTE.ID2 ne sont uniques et encore moins PK).
Et niveau données ce que ça donne, par exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
Produit :
ID NOM TEXTE_ID
1 Voiture 1
2 Bateau 3
3 Avion 4
Texte :
ID LANGUE_ID ID2 TRADUCTION
1 1 1 Voiture
2 2 1 Car
3 2 3 Boat
4 1 4 Avion
5 1 3 Navire
6 2 4 Avion |
Explication.
Lorsqu'on crée un produit, aucune traduction n'est créée. Le "TEXTE_ID" reste à NULL. (déjà, nawak niveau 1FN)
Ensuite, lorsqu'on crée la première traduction, QUELLE QUE SOIT LA LANGUE, TEXTE.ID prend la prochaine valeur du compteur de la table, et TEXTE.ID2 prend la même valeur. PRODUIT.TEXTE_ID prend alors la même valeur que TEXTE.ID2
Ensuite, lors des traductions suivantes, pour le même article, TEXTE.ID prend les valeurs suivantes du compteur de la table, et TEXTE.ID2 prend comme valeur PRODUIT.TEXTE_ID
D'un point de vue performance (index) j'imagine comprendre, partiellement, le voeux du développeur... Un index sur TEXTE.ID2 permet de retrouver les textes associés à un produit en une simple lecture d'index.
Ok...
Mais pourquoi ne pas avoir fait :
PRODUIT
----------
ID (PK)
NOM (langue de base)
TEXTE
-------
ID (PK)
LANGUE_ID (PK)
ENTITE_NOM
ENTITE_ID (FK logique)
TRADUCTION
Ainsi :
ENTITE_NOM contiendrait "PRODUIT" pour les traductions d'articles.
Et ENTITE_ID contiendrait l'ID du produit traduit.
Et un bête index unique sur ENTITE_NOM, ENTITE_ID, LANGUE_ID permettait de faire la même chose, avec un modèle, à défaut d'être parfaitement 1FN, non seulement plus lisible (pas de recopie d'ID dans tous les sens, d'auto-jointures, etc.) mais surtout plus intuitif, et très certainement plus performant.
Ou si j'ai raté un truc ?