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

Décisions SGBD Discussion :

Comment bien structurer des relations n-to-n et conserver des requêtes simples ?


Sujet :

Décisions SGBD

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Comment bien structurer des relations n-to-n et conserver des requêtes simples ?
    Bonjour,

    Je m'interroge sur la meilleur facon de structurer ma base et mes tables dans le cadre de relation n to n, utilisés pour des controles d'accès.
    Le plus simple est de vous donner un exemple.

    J'ai une table fournisseur, une table catégorie, une table utilisateur.
    Chaque fournisseur peut être associé à plusieurs catégories.
    Un utilisateur a des droits sur plusieurs catégories dans son profil.
    Remarque: On compte plusieurs centaine de catégorie

    Un utilisateur peut voir uniquement les fournisseurs associés à ses catégories.

    exemple
    Fournisseur A produit les catégories 1, 2, et 3
    Fournisseur B produit les catégories 6 et 7
    Utilisateur u1 peut voir les categories 1, 7
    Utilisateur u2 peut voir les categories 4, 6
    -> u1 peut voir le fournisseur A et B
    -> u2 ne voit que le fournisseur B

    Première question : Comment structurer les liens fournisseurs/catégories et utilisateur/catégories?
    De ce que j'ai pu lire sur les SGBD je pense à un modèle de type :
    table Fournisseur_vs_category
    FournisseurID | CategorieID
    A|1
    A|2
    B|6
    B|7


    table Utilisateur_vs_category
    UtilisateurID | CategorieID
    u1 | 1
    u1 | 7
    u2 | 4
    u2 | 6


    Néanmoins j'ai pensé également au modèle type CSV ...
    table Fournisseur_vs_category
    FournisseurID | CategorieList
    A| 1,2,3
    B| 6,7


    table Utilisateur_vs_category
    UtilisateurID | CategorieList
    u1 | 1,7
    u2 | 4,6


    ...mais celui-ci parait moins stable.


    Deuxième question : Comment limiter les fournisseurs visibles par l'utilisateur en fonction des catégories.

    Sachant qu'il peut y avoir une centaine de catégorie, comment effectuer un controle efficace et rapide ? Quel type de requête ou fonction serait recommendées.

    D'avance merci pour vos éléments de réponses.
    Loïc

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Question 1
    Première solution : rien à redire.
    Deuxième solution : jamais (viole la FN1)
    Question 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT f.FournisseurID
    FROM Fournisseur_vs_category f INNER JOIN Utilisateur_vs_category u
                                           ON f.CategorieID = u.CategorieID
    WHERE u.UtilisateurID = :taVariable
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Par la suite ...
    Merci Médiat

    Dans cette méthode l'idée est "d'isoler" un jeu d'enregistrements valides pour cette utilisateur, puis sur cette base de sélectionner les autres données visibles (ie: nom du fournisseur, contrats ...)

    De fait l'appel à ce jeu d'enregistrement va être très fréquent et je pensais créer un User Defined Function de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE FUNCTION VisibleSupplier
    (@UtilisateurID int)
    RETURNS TABLE 
    AS
    SELECT DISTINCT f.FournisseurID
    FROM Fournisseur_vs_category f INNER JOIN Utilisateur_vs_category u 
      ON f.CategorieID = u.CategorieID
    WHERE u.UtilisateurID = @UtilisateurID 
    GO
    puis d'exploiter les données comme suit :
    (nb: table_Fournisseurs contient les données fournisseurs avec une clé FournisseurID )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table_Fournisseurs.* 
    FROM table_Fournisseurs f INNER JOIN ::VisibleSupplier(:ma variable utilisateur) v 
       ON f.FournisseurID = v.FournisseurID
    
    Qu'en pensez vous ?
    Merci.

    Loïc

Discussions similaires

  1. Comment bien structurer mes classes
    Par jlenoir dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 26/04/2011, 17h11
  2. Comment bien documenter des bases de données
    Par DEV-10 dans le forum Modélisation
    Réponses: 19
    Dernier message: 16/01/2008, 21h37
  3. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  4. relation avec le client - comment bien concevoir une appli
    Par ver_for dans le forum Modélisation
    Réponses: 2
    Dernier message: 08/05/2007, 12h35
  5. [VBA][Excel] Comment bien structurer son code?
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2007, 19h39

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