IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

problème philosophique de relations entre tables et vues.


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut problème philosophique de relations entre tables et vues.
    bonjour,

    je récupère une base de donnée qui m'interroge au niveau de certains aspect de sa conceptions. notamment la gestion des données de références.
    Les données de références (civilité, pays, professions, ...) sont toutes gérés par une table "référence" unique de la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    table reference
    - colonne : varchar 30, PK
    - id : int, PK
    - value : varchar 100.
     
    cette table contient par exemple :
    colonne   id   value
    civilité     1   Mr
    civilité     2   Mme
    civilité     3   Mlle
    pays       1   France
    pays       2   Grande Bretagne
    etc...
    L'application permet à l'utilisateur par un IHM très simple d'ajouter, supprimer, modifier les données de cette table. c'est assez pratique, la configuration de l'application est du coup très simple.

    dans le reste du modèle les données de référence sont donc recherché dans cette table mais sans contraintes d'intégrité référentielle. par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    table personne :
    - nom : varchar 30
    - civilité_id : id de la table référence ou colonne = "civilité"
    - pays_id : id de la table référence ou colonne = "pays"
    - etc...
    mon problème est le suivant (mis à part que je trouve ça très laid et in-maintenable) :
    Comment garantir l'intégrité référentielle de ces relations "conditionnelles". en effet, tel que décris ci dessus, rien ne garantit que civilité_id référence effectivement une civilité et non un pays... et je me retrouve à devoir gérer ces problèmes d'intégrité dans la couche métier.

    je vois plusieurs solutions mais qui ont toutes leurs problèmes :
    1) re-normaliser le modèle : créer une table Pays et une table civilité, faire pointer toutes mes relations sur ces tables.
    - c'est un gros boulot qui casse tous le modèle (et donc l'application)
    - c'est finalement très pratique d'avoir toutes les données de références dans la même table. Cela permet d'avoir une IHM d'édition des données de références très simple. à l'inverse la renormalisation m'oblige à faire un code spécifique d'IHM pour Pays, civilité etc...
    2) mettre les deux PK de la table relation en FK de la table relationnée... i.e. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        table personne :
        - nom : varchar 30
        - civilité_colonne : colonne de la table de référence = "civilité"
        - civilité_id : id de la table référence
        - pays_colonne : colonne de la table de référence = "pays"
        - pays_id : id de la table référence
    - c'est la solution que j'ai choisi jusque la, mais vu le nombre de type de données de référence auquel j'ai affaire, je me retrouve avec un nombre doublé de FK dans mes tables, de plus la colonne civilité_colonne (par exemple) contient toujours "civilité" (idem pour pays et les autres), ce qui me semble absurde.

    ce problème me chagrine foncièrement à m'emmena à penser à une troisième solutions :
    3) utilisations de vues et relation sur la vue. c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create vue PAYS AS select id, value from reference when colonne ="pays"
    et rajouter une contrainte référentielle sur la table personne pointant sur l'id de la vue PAYS. du coup je bénéficierais du meilleurs des deux mondes : gestion unifiée des données de référence, lisibilité et maintenabilité de mon modèle, intégrité référentielle.
    - mais est t'il seulement possible de créer des relations sur des vues (je suis sous postgres).
    - est ce que je ne me retrouverais pas avec des problèmes de performance à la moindre jointure.
    - est-ce que ce modèle est portable sur d'autre BD que la mienne ?

    J'avoue que je suis perplexe, cette question m'a l'air presque classique et pourtant je ne vois pas de manière "élégante" de la résoudre. Peut être y à t'il une solution plus simple...

    Quelqu'un aurais t'il un avis sur cette question?
    je serais curieux d'avoir vos avis.

    Merci

    Patrice.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 013
    Points
    53 013
    Billets dans le blog
    6
    Par défaut
    mon problème est le suivant (mis à part que je trouve ça très laid et in-maintenable) :
    Pour ma part je trouve ni l'unni l'autre... Mais en général je fais le contraire, c'est à dire n tables de référence et une super vue en UNION ALL de toutes les références...

    Comment garantir l'intégrité référentielle de ces relations "conditionnelles". en effet, tel que décris ci dessus, rien ne garantit que civilité_id référence effectivement une civilité et non un pays... et je me retrouve à devoir gérer ces problèmes d'intégrité dans la couche métier.
    effectivement c'est le hic. Pas de DRI. Pour autant vous pouvez mettre en place une intégrité référentielle par trigger ! Il serait cependant plus prudent que figure dans la table de référence, une colonne de plus avec la nature de la référence (civilité, pays, code posal...).

    J'avoue que je suis perplexe, cette question m'a l'air presque classique et pourtant je ne vois pas de manière "élégante" de la résoudre. Peut être y à t'il une solution plus simple...
    Oui, celle que je vous ais donné au départ :
    • Créer autant de table de référence que nécessaire.
    • Créer autant de contraintes FK pour assurer les DRI
    • Synthétiser toutes les références dans une seule vue.

    On peut encore aller plus loin enfaisant du mapping RO :
    des trigger INSTEAD OF INSERT, UPDATE, DELETE dans la vue qui réalisent les différentes mises à jour dans les vrais tables.

    A +

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    • Créer autant de table de référence que nécessaire.
    • Créer autant de contraintes FK pour assurer les DRI
    • Synthétiser toutes les références dans une seule vue.
    j'y ai également pensé, ça à l'air la solution la plus naturelle (au moins du point de vue du modèle de donnée) mais sous postgres, il me semble qu'il n'est pas possible de faire des updates/insert/delete sur des vues... je vais étudier l'histoire des triggers INSTEAD OF...

    d'autres avis ?

    P.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il me semble que, comme leur nom l'indique, les vues sont faites pour voir les données, pas pour les modifier !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 013
    Points
    53 013
    Billets dans le blog
    6
    Par défaut
    Il me semble que, comme leur nom l'indique, les vues sont faites pour voir les données, pas pour les modifier !
    Ha non, ça c'est TOTALEMENT FAUX !
    Une vue est là pour assurer le niveau externe des différents schémas :
    1) Schéma conceptuel (les entité et les associations)
    2) Schéma logique (les relations)
    3) Schéma physique (les tables)
    4) Schéma externe (les vues)
    Ce n'est qu'a partir de vues que le développeur devrait travailler, ce qui est rarement le cas hélas et cette erreur coûte très cher en terme de maintenance applicative, car le remaniement du modèle oblige a redévelopper, alors que passer par des vues est insensible du point de vu applicatif !

    Relisez la règle N°6 de CODD (1985 !) :
    RÈGLE 6 - Règle de mise à jour des vues :
    Toutes les vues qui sont théoriquement modifiables peuvent être mises à jour par le système.

    http://sqlpro.developpez.com/SGBDR/R...egles_codd.pdf

    A +

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Sans vouloir rentrer dans le débat sur l'utilisation des vues,
    Postgresql ne permet pas les mises à jours sur les vues (ou alors peut-etre en développant des triggers compliqués...)

    Avant de pousser mes recherches sur la mises à jour des vues,
    j'aimerais avoir d'autres avis sur ma question initiales de gestion des données de référence...

    des suggestions?
    merci.

    Patrice.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 013
    Points
    53 013
    Billets dans le blog
    6
    Par défaut
    Je vous ais donné mon point de vue. Voici pour compléter une norme de développement base de données plus complète :
    http://www.sqlspot.com/Norme-de-developpement.html
    Intéressez notamment au paragraphe 1.3.7.

    A +

Discussions similaires

  1. [10g] Relation entre table et vue matérialisée
    Par sevlev59 dans le forum Oracle
    Réponses: 1
    Dernier message: 22/03/2013, 16h29
  2. problème de relation entre tables
    Par sky88 dans le forum Modélisation
    Réponses: 3
    Dernier message: 27/06/2009, 20h18
  3. [97] Problème de relations entres tables
    Par totojordi dans le forum Modélisation
    Réponses: 6
    Dernier message: 27/05/2008, 23h31
  4. Problème de relation entre tables
    Par florian04 dans le forum Modélisation
    Réponses: 3
    Dernier message: 05/05/2008, 08h29
  5. [phpMyAdmin] Problème relation entre tables
    Par momo0409 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 14/09/2007, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo