Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
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 23/06/2006, 00h36   #1
Invité de passage
 
Inscription : juin 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 2
Points : 0
Points : 0
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
Berthevas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2006, 05h22   #2
Inactif
 
Avatar de Médiat
 
Inscription : décembre 2003
Messages : 1 946
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 1 946
Points : 1 932
Points : 1 932
Question 1
Première solution : rien à redire.
Deuxième solution : jamais (viole la FN1)

Question 2
Code :
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
Médiat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2006, 14h16   #3
Invité de passage
 
Inscription : juin 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 2
Points : 0
Points : 0
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 :
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 :
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
Berthevas 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 04h30.


 
 
 
 
Partenaires

Hébergement Web