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

Schéma Discussion :

Relation utilisant une relation [MCD]


Sujet :

Schéma

  1. #1
    Membre expérimenté

    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    690
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 690
    Points : 1 478
    Points
    1 478
    Par défaut Relation utilisant une relation
    Bonjour à tous,
    J'ai un cas un peu spécial dans la modélisation d'une BD.
    Est il "clean" de lier une relation avec une autre relation dans un MCD ? Je veux dire par cela, est ce que cela risque de poser des problèmes conceptuels ou de performance ?
    Je donnes un exemple pour eclaircir tout ça.
    Imaginons une entité Client liée à une entitée GroupeClient par la relation "appartenir"
    L'entité GroupeClient est liée à l'entité Privileges par la relation "avoir privileges" (des privilèges sont afféctés à des groupes de clients).

    Maintenant je veux créer la relation liant un client à un privilège, mais cette relation est dépendant du groupe client car c'est avec ce dernier que sont définis les privilèges. Dans tous les cas, il sera techniquement faisable de donner n'importe quel privilège à n'importe quel client..... Sauf si on lie notre relation avec la relation "avoir privilèges.
    Est ce que cette bidouille m'apportera des problèmes que je ne vois pas ?

    Désolé si l'explication est un peu fastidieuse, je me ferais un plaisir d'éclaircir tout ça au besoin.

    Merci

  2. #2
    Nouveau membre du Club Avatar de MadStar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 30
    Points
    30
    Par défaut
    En effet j'ai du mal à comprendre pourquoi tu veux faire ça.
    Est ce que tu pourrais expliquer où tu veux en venir ?

  3. #3
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Puisqu’un client appartient à un seul groupe, il hérite a priori de tous les privilèges du groupe.
    Si vous souhaitez restreindre ces privilèges pour certains clients, alors seulement dans ce cas vous pouvez mettre en relation l’entité-type Client et l’association-type Avoir_Privilèges. Pour éviter de traiter à la fois du besoin fonctionnel et des contraintes techniques merisiennes (mettre en relation une entité-type et une association-type), je pars du MLD (où j’ai renommé Avoir_Privilèges en Priv_Groupe).



    Mais attention au piège : selon ce MLD, aucune contrainte n’interdit d’attribuer à un client des privilèges qui sont ceux d’un groupe qui n’est pas le sien : il faudra prévoir de mettre en œuvre la règle selon laquelle les privilèges attribués à un client doivent faire partie des privilèges du groupe auquel appartient le client. Selon la norme SQL, il faut prévoir la mise en œuvre d’une instruction CREATE ASSERTION. Si votre SGBD ne propose pas cette instruction, il faudra en passer par des triggers pour contrôler l’insertion des lignes dans la table Priv_Client et la modification des groupes dans cette même table.
    Voici un exemple de trigger concernant l’insertion (MS SQL Server 2005). Quand la règle est respectée, la table Priv_Client est alimentée, sinon les délinquants sont envoyés dans une table des rebuts.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Create trigger T1 ON Priv_Client Instead Of Insert As
      INSERT INTO Priv_Client 
         SELECT  *
         FROM    Inserted i
         Where   Exists (Select *
                         From   Client c
                         Where  i.GroupeId = c.GroupeId) ;
      Insert Into Priv_Client_Rebut
         Select * 
         From   Inserted i  
         Where  not exists (Select *
                            From   Client c
                            Where  i.GroupeId = c.GroupeId) ;
    Je vous laisse le soin d’adapter ce trigger en fonction de votre SGBD et de coder le trigger de mise à jour.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  4. #4
    Membre expérimenté

    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    690
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 690
    Points : 1 478
    Points
    1 478
    Par défaut
    Mais attention au piège : selon ce MLD, aucune contrainte n’interdit d’attribuer à un client des privilèges qui sont ceux d’un groupe qui n’est pas le sien : il faudra prévoir de mettre en œuvre la règle selon laquelle les privilèges attribués à un client doivent faire partie des privilèges du groupe auquel appartient le client. Selon la norme SQL, il faut prévoir la mise en œuvre d’une instruction CREATE ASSERTION. Si votre SGBD ne propose pas cette instruction, il faudra en passer par des triggers pour contrôler l’insertion des lignes dans la table Priv_Client et la modification des groupes dans cette même table.
    C'est la réponse que je voulais avoir ! Ce sont donc les assertions qui permettent d'integrer une telle règle d'affaire dans un modèle de données.

    Merci beaucoup pour la limpidité de votre réponse !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MCD] Dois-je utiliser une relation réflexive?
    Par Maeho dans le forum Schéma
    Réponses: 7
    Dernier message: 11/02/2013, 05h28
  2. Créer une relation entre une base SQL-SERVER et MySQL
    Par JacNar6 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 19/09/2012, 14h09
  3. Réponses: 4
    Dernier message: 16/11/2011, 09h01
  4. [Relations] Ajouter une relation avec table liée
    Par Jean-Philippe André dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/10/2007, 14h09
  5. Utiliser UniqueIdentifier dans une relation
    Par kritopal dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2006, 19h43

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