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 :

[MCD] Relation n-aire et partie de clef null


Sujet :

Schéma

  1. #1
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut [MCD] Relation n-aire et partie de clef null
    Bonjour,
    J' ai pas trouver d'auters endroits pour poster cela:
    J'aimerai optimiser une fonctionnalité de ma base.

    Pour vous expliquer:

    J'ai les tables "Serveur", "Baie", "Switch" et "Disjoncteur"

    Pour expliquer, un serveur, une baie, et un switch peuvent etre sur 1 ou N disjoncteurs et 1 disjoncteur peut avoir, soit un serveur, et/ou ne baie, et/ou un switch.

    D'après ma logique, j'aurais créé des relation 1,N / 1,N entre :
    "Serveur" (0,N)===(association)===(0,N) "Disjoncteur"
    "Baie" (0,N)===(association)===(0,N) "Disjoncteur"
    "Switch" (0,N)===(association)===(0,N) "Disjoncteur"

    Le pb en faisant ca q'est que j'ai une table intermédiaire à chaque fois.

    En fait j'aimerai avoir qu'une seule table intermédiaire entre :
    "Disjoncteur" et les autres tables, ce qui signifie que les champs de cette table intermédiaire serait:

    ==============
    Table intermédiaire
    ==============
    Disjoncteur_Id
    Serveur_Id
    Baie_Id
    Switch_Id

    ==============

    et tous en clé primaire. Le pb, c'est comme certain champs sont facultatif... ben on ne peut pas mettre une clé primaire à NULL

    J'aimerai avoir ca par ex:

    ======================================
    Disjoncteur_Id | Serveur_Id | Baie_Id | Switch_Id
    ======================================
    1 1 NULL NULL
    1 2 4 NULL
    2 NULL 3 NULL
    1 NULL 3 5


    Si ca se trouve je fais n'importe quoi et il serait plus facile de tout renseigner dans la table "Disjoncteur" structuré comme cela:

    =====================
    Disjoncteur
    =====================
    Disjoncteur_Id
    Serveur_Id (clé étrangère)
    Baie_Id (clé étrangère)
    Switch_Id (clé étrangère)
    =====================

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    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 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut Soyez précis SVP...
    1)
    Pour expliquer, un serveur, une baie, et un switch peuvent etre sur 1 ou N disjoncteurs
    Soyez précis :
    Un serveur est-il nécessairement relié à au moins un disjoncteur (lien 1-N) ? Ou bien cette relation est-elle facultative (lien 0-N) ?

    2)
    1 disjoncteur peut avoir, soit un serveur, et/ou ne baie, et/ou un switch.
    "soit" marque une exclusion, "et/ou" marque une inclusion. Que doit-on retenir ? (je suppose que "soit" est à évacuer).

    3)
    D'après ma logique, j'aurais créé des relation 1,N / 1,N entre :
    "Serveur" (0,N)===(association)===(0,N) "Disjoncteur"...
    C’est 1-N ou 0-N ? En plus, ceci est contradictoire avec le point précédent, selon lequel pour un disjoncteur on a au plus un serveur, etc.

    4)
    Le pb en faisant ca q'est que j'ai une table intermédiaire à chaque fois.
    Qu’est-ce qui vous gêne ? Si vous voulez ne voir qu’une table, vous créez une vue (c’est une table virtuelle, non instanciée, mais table quand même) qui serait l’union de la jointure naturelle sur l’attribut Disjoncteur_Id) des tables intermédiaires (table de base, instanciées). Voir plus bas.

    5)
    Si ca se trouve je fais n'importe quoi et il serait plus facile de tout renseigner dans la table "Disjoncteur" structuré comme cela:

    =====================
    Disjoncteur
    =====================
    Disjoncteur_Id
    Serveur_Id (clé étrangère)
    Baie_Id (clé étrangère)
    Switch_Id (clé étrangère)
    =====================
    Le signe d’une bonne modélisation est que les colonnes des tables ne puissent pas prendre la "valeur nulle". Or ici vous n’avez que cela, hormis la colonne Disjoncteur_Id. En outre, comme la clé primaire ne comporte que cette colonne vous ne pouvez associer à un disjoncteur au plus qu’un serveur, une baie, un switch. Or vous dites plus haut (point 3) qu’un disjoncteur peut être associé à plusieurs serveurs, etc.
    =>
    Encore une fois, soyez rigoureux dans la formulation de votre problème. Je sais bien que concrètement certaines réponses aux questions ci-dessous sont évidentes, mais considérez que je remplace les mots disjoncteur, serveur, baie, switch, par x, y, z, t. Je pose donc les questions :
    Q1 : Un serveur peut-il ne pas être associé à un disjoncteur ?
    Q2 : Un serveur peut-il être associé à plus d’un disjoncteur ?
    Q3 : Un disjoncteur peut-il ne pas être associé à un serveur ?
    Q4 : Un disjoncteur peut-il être associé à plus d’un serveur ?
    Q5 : Un disjoncteur peut-il être simultanément être lié à un serveur, une baie, un switch ? (D’après votre exemple, c’est le cas, mais le mot "soit" du point 2 est alors à éliminer).
    Etc., les questions concernant les liens disjoncteur et serveur valent pour les baies et les switchs.

    Un exemple de vue (SQL Server) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Create Table Disjoncteur
    (DisjoncteurId     Char(4)  Not null, 
     DisjoncteurNom    Char(4)  Not null,
     Primary key (DisjoncteurId)
    ) ; 
    
    Create Table Serveur
    (ServeurId     Char(4)  Not null, 
     ServeurNom    Char(4)  Not null,
     Primary key (ServeurId)
    ) ; 
    
    Create Table Baie
    (BaieId     Char(4)  Not null, 
     BaieNom    Char(4)  Not null,
     Primary key (BaieId)
    ) ; 
    Create Table Switch
    (SwitchId     Char(4)  Not null, 
     SwitchNom    Char(4)  Not null,
     Primary key (SwitchId)
    ) ; 
    
    Create Table DisjoncteurServeur
    (DisjoncteurId     Char(4)  Not null, 
     ServeurId         Char(4)  Not null,
     Primary key (DisjoncteurId),
     Foreign key (DisjoncteurId) References Disjoncteur,
     Foreign key (ServeurId) References Serveur,
    ) ; 
    
    Create Table DisjoncteurBaie
    (DisjoncteurId     Char(4)  Not null, 
     BaieId            Char(4)  Not null,
     Primary key (DisjoncteurId),
     Foreign key (DisjoncteurId) References Disjoncteur,
     Foreign key (BaieId) References Baie,
    ) ; 
    
    Create Table DisjoncteurSwitch
    (DisjoncteurId     Char(4)  Not null, 
     SwitchId          Char(4)  Not null,
     Primary key (DisjoncteurId),
     Foreign key (DisjoncteurId) References Switch,
     Foreign key (SwitchId) References Switch,
    ) ; 
    GO
    Create View V (DisjoncteurId, ServeurId, BaieId, SwitchId, TypeMateriel) As
      Select DisjoncteurId, ServeurId, ' ', ' ', 'serveur' 
      From   DisjoncteurServeur
    Union All  
      Select DisjoncteurId, ' ', BaieId, ' ', 'baie' 
      From   DisjoncteurBaie
    Union All  
      Select DisjoncteurId, ' ', ' ', SwitchId, 'switch' 
      From   DisjoncteurSwitch
    GO
    
    Select * from V ;

  3. #3
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Désolé de pas avoir été précis.
    Finalement je vais faire mes petites tables intermédiaires, ca va être plus simple. J'y pensais plus pour faire des vues parce que c'est un dev rapide sous access (bouhhh pas bien...), donc le sytème de vue m'est complètement sorti de la tête.

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

Discussions similaires

  1. [MCD] Cardinalité d'une relation n-aire ?
    Par elechi.ahmed dans le forum Schéma
    Réponses: 13
    Dernier message: 31/08/2008, 19h31
  2. [MCD]relation entre tables comment faire?
    Par hicham28 dans le forum Modélisation
    Réponses: 8
    Dernier message: 10/04/2007, 21h32
  3. [MCD] Relation récursive
    Par storm_2000 dans le forum Schéma
    Réponses: 4
    Dernier message: 08/11/2006, 20h40
  4. [MCD] Relation n-aires
    Par clarence dans le forum Schéma
    Réponses: 17
    Dernier message: 03/07/2006, 22h44
  5. [MCD]Relation Utilisateurs - Groupes - Fonction
    Par clarence dans le forum Schéma
    Réponses: 7
    Dernier message: 07/06/2006, 13h52

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