Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    mars 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : mars 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Contrainte double sens

    Bonjour, j'aimerai pouvoir faire une contrainte multi sens sur deux tables.
    le but est d'avoir une correspondance entre la référence interne et celle d'autres fournisseurs en privilégiant les valeurs du fournisseur le plus important

    voilà les tables

    interne
    -----------
    id | nom | fournisseur_id_auto_prefered
    1 | jambon | 1
    2 | fromage |4

    fournisseurs
    ---------------------------
    id_auto | interne_id | id_fournisseur | nom | valeur_a | produit
    1 | 1 | 212354 | super machin | bla | jambon
    2 | 1 | 1567461 | super truc | bli | jambon (variante)
    3 | 1 | 2154354 | chose | bli | jambon (variante2)
    4 | 2 | 212354 | hyper chose | bla | fromage (variante)
    5 | 2 | 1567462 | super machin | bli | fromage
    6 | 2 | 2154355 | chose | bli | fromage (variante 2)

    Le problème c'est que je peux faire la PK que dans un sens. sinon ça bloc la création du schéma.

    Avez vous une idée? nom but est d'accélérer les SELECT car il y a beaucoup plus de requête SELECT qu'INSERT et le faite d'avoir la valeur préféré me permet d'attaquer la table sans avoir le poids du JOIN dans la requête ou un booléen dans la table fournisseur avec un INDEX pour filtrer les préférences.

    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)

    Par défaut

    Vraiment difficile de comprendre le contexte du besoin exprimé, proposer un MCD aurait sans doute été plus parlant. Dans ce cas de figure, les contraintes de clés primaires semble être pour la table "interne" être "ID" et "nom" pour la table "fournisseur" la colonne produit n'a du coup rien à y faire puisqu'elle est désignée dans la table interne sous le champ "nom", il faut créer une clé étrangère sur la table fournisseur indiquant que "interne_id" fait référence à "ID" de la table interne. Et pour choisir la valeur fournisseur_id_auto_prefered, il va falloir réaliser une requête ou procédure stockée en maximisant ou minimisant cette valeur en fonction de ce que signifie cette valeur. En tout état de cause, celà ressemble grandement à un héritage !
    Dernière modification par Chtulus ; 21/11/2012 à 20h33.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 641
    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 : 13 641
    Points : 30 218
    Points
    30 218

    Par défaut

    Il est tout à fait possible de réaliser une contrainte référentielle circulaire entre deux tables A=>B et B=>A, à condition que votre SGBDR supporte les contraintes déferrable, ce qui n'est pas le cas général...
    Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p6...t_deferabilite
    Vous trouverez plus d'information dans mon livre sur SQL...

    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 * * * * *

  4. #4
    Invité de passage
    Inscrit en
    mars 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : mars 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par cladsous Voir le message
    Vraiment difficile de comprendre le contexte du besoin exprimé, proposer un MCD aurait sans doute été plus parlant. Dans ce cas de figure, les contraintes de clés primaires semble être pour la table "interne" être "ID" et "nom" pour la table "fournisseur" la colonne produit n'a du coup rien à y faire puisqu'elle est désignée dans la table interne sous le champ "nom", il faut créer une clé étrangère sur la table fournisseur indiquant que "interne_id" fait référence à "ID" de la table interne. Et pour choisir la valeur fournisseur_id_auto_prefered, il va falloir réaliser une requête ou procédure stockée en maximisant ou minimisant cette valeur en fonction de ce que signifie cette valeur. En tout état de cause, celà ressemble grandement à un héritage !
    Salut,
    Rien à avoir avec un héritage. Tu mets l'héritage en place quand tu as plus d'une table enfant possédant des champs connexes. Puis en Postgresql ça pose des problèmes sur certains type de requête. Mais j'ai pas parlé du SGBD car je souhaite connaitre le standard SQL primordialement.


    Notre amis SQL Pro m'a bien éclairé. C'est donc que m'a demande était assez clair. Je souhaite faire une clé déferrable.

    J'utilise Django pour faire mon modèle et par défaut il crée des clés déferrables et Postgresql les supportes parfaitement. Donc c'est OK. le problème vient de l'ordre de résolution des appels aux classes lors de la contruction. J'ai un ami qui vient de m'expliquer que la seconde FK appelée doit être déclaré comme String et non comme Objet donc je vais tester. Sinon merci pour le suivi et pour vos renseignements.

    Je mettrais le bout de SQL une fois terminé car le Python c'est pas vraiment l'endroit.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 641
    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 : 13 641
    Points : 30 218
    Points
    30 218

    Par défaut

    Citation Envoyé par gglafouine Voir le message
    J'utilise Django pour faire mon modèle et par défaut il crée des clés déferrables et Postgresql les supportes parfaitement. Donc c'est OK. le problème vient de l'ordre de résolution des appels aux classes lors de la contruction. J'ai un ami qui vient de m'expliquer que la seconde FK appelée doit être déclaré comme String et non comme Objet donc je vais tester. Sinon merci pour le suivi et pour vos renseignements.
    Je vous souhaite bien du plaisir avec ce framework qui ressemble d'ailleurs plus à un ORM qu'un framework... Car vous allez souffrir si vous voulez à la fois les performances et des transactions complexes. Ce genre d'outil est fait pour développer rapidement mais hélas produit un code SQL catastrophiquement pauvre et donc aux performances nulles quand ce n'est pas inexploitable (vous vous amuserez bien lors de la montée en charge).

    Lisez l'article que j'ai écrit à ce sujet : http://img1.lemondeinformatique.fr/f...s-epaisses.pdf

    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 * * * * *

  6. #6
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 895
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 895
    Points : 25 037
    Points
    25 037

    Par défaut

    Django contient effectivement un Objet Réellement Merdique mais il semble quand même possible d'écrire des requêtes en SQL, même si les exemples donnés sont extrêmement simples (qui de requêtes plus complexes ? )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Invité
    Invité(e)

    Par défaut

    Je viens de lire l'article de SQLPro et j'avoue que malgré la lecture je n'ai toujours rien compris à ce qu'est defferable. Ma curiosité reste entière.

  8. #8
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 895
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 895
    Points : 25 037
    Points
    25 037

    Par défaut

    Je crois que c'est ça :
    Citation Envoyé par SQLPro
    Le déferrement n’intervient que dans une transaction et si contraintes déférée il y a, alors la vérification de la contrainte sera effectuée au moment du COMMIT et non à chaque ordre SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Invité
    Invité(e)

    Par défaut

    Après quelques recherches je crois comprendre que le defered est un attribut que l'on donne à une contrainte; reprenez moi si je me trompe. Je serait curieux de voir l'implémentation de cette clé déférable pour mieux comprendre son intérêt et la nécessité d'implémenter ce genre de truc.

    Et pour revenir sur la question initiale de l'auteur, je ne comprends toujours pas pourquoi sa modélisation est n'est pas normalisée, mais peut-être est-ce nécessaire dans ce cas de figure.

  10. #10
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 895
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 895
    Points : 25 037
    Points
    25 037

    Par défaut

    Citation Envoyé par cladsous
    je ne comprends toujours pas pourquoi sa modélisation est n'est pas normalisée
    Citation Envoyé par gglafouine
    interne
    -----------
    id | nom | fournisseur_id_auto_prefered
    1 | jambon | 1
    2 | fromage |4

    fournisseurs
    ---------------------------
    id_auto | interne_id | id_fournisseur | nom | valeur_a | produit
    1 | 1 | 212354 | super machin | bla | jambon
    2 | 1 | 1567461 | super truc | bli | jambon (variante)
    3 | 1 | 2154354 | chose | bli | jambon (variante2)
    4 | 2 | 212354 | hyper chose | bla | fromage (variante)
    5 | 2 | 1567462 | super machin | bli | fromage
    6 | 2 | 2154355 | chose | bli | fromage (variante 2)
    Pour la table bizarrement appelée "interne", c'est normalisé.

    Pour la table mal nommée "fournisseurs" (pas de pluriel pour commencer ! ), elle ne devrait contenir que les données des fournisseurs et pas des produits que ces fournisseurs fournissent. A minima, s'il s'agit d'indiquer le produit principal négocié avec le founisseur, il devrait y avoir une clé étrangère référençant "interne" et pas "jambon" ou "fromage".
    Et que vient faire cette "variante" ?
    Pourquoi y a t-il un id_auto + un id_fournisseur et pourquoi y a t-il deux fois l'id_fournisseur 212354 ?
    Sans les règles de gestion des données et/ou sans le MCD, il est difficile de se prononcer mais ça semble bien fouillis quand même !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •