# Gnral Dveloppement > ALM > Modlisation > Schma >  Cration de table et cl trangre

## Nathanz

Bonjour, je dbute en sql, j'ai une question concernant les cls trangres.
Voici mes relations :
Salle (NoSalle, Categorie, NbPlaces)

UE (CodeUE, NomUE, Formation, HC, HTD, HTP, HCRes, HTDRes, HTPRes)

Groupes (Groupe, Formation, Effectif)

Reservation (NoReservation, NoSalle, CodeUE, Groupe, Formation, Nature)



```

```

Ici est ce que formation est une cl trangre comme la cl de groupe est compos ?  Devrais-je pltot mettre:
 Formation VARCHAR(40) REFERENCES Groupes(Formation)

De mme :


```

```

Dois-je mettre une rfrence a formation et groupe ? 
Sachant que ma table Groupes ressemble  a:


```

```

Je vous remercie d'avance pour vos rponses  ::D:

----------


## al1_24

Bonjour,




> Dois-je mettre une rfrence a formation et groupe ?


Dans l'absolu, en conservant ce modle de donnes, la rponse serait _oui_.

Toutefois, l'usage de chaines de caractres en tant que cl primaire n'est pas optimal. On prfrera utiliser un identifiant numrique auto-incrment, non porteur de sens. Ce qui n'empche pas d'ajouter une contrainte d'unicit sur le libell associ.
Ainsi, si le libell devait tre modifi, il ne sera pas ncessaire d'aller modifier toutes les lignes correspondantes dans les tables lies par une contrainte d'intgrit rfrentielle.

Le modle de donnes ressemblerait alors  cela : (# cl primaire, * cl unique, & cl trangre)

Salle (#Id_salle, *NoSalle, Categorie, NbPlaces)
UE (#Id_Ue, *CodeUE, NomUE, Formation, HC, HTD, HTP, HCRes, HTDRes, HTPRes)
Groupes (#Id_Groupe, *Groupe, *Formation, Effectif)
Reservation (#Id_Reservation, NoReservation, &Id_Salle, &Id_UE, &Id_Groupe, Nature)

Mais ce qui est encore plus important, c'est de commencer sa modlisation en dtaillant les rgles fonctionnelles qui dcrivent les entits et leurs relations :

Une salle a un numro, correspond  une catgorie et un nombre de places
Le numro de la salle est unique
La salle peut faire l'objet de plusieurs rservations
etc

----------


## Nathanz

> Bonjour,
> Toutefois, l'usage de chaines de caractres en tant que cl primaire n'est pas optimal. On prfrera utiliser un identifiant numrique auto-incrment, non porteur de sens. Ce qui n'empche pas d'ajouter une contrainte d'unicit sur le libell associ.
> Ainsi, si le libell devait tre modifi, il ne sera pas ncessaire d'aller modifier toutes les lignes correspondantes dans les tables lies par une contrainte d'intgrit rfrentielle.
> 
> Le modle de donnes ressemblerait alors  cela : (# cl primaire, * cl unique, & cl trangre)
> 
> Salle (#Id_salle, *NoSalle, Categorie, NbPlaces)
> UE (#Id_Ue, *CodeUE, NomUE, Formation, HC, HTD, HTP, HCRes, HTDRes, HTPRes)
> Groupes (#Id_Groupe, *Groupe, *Formation, Effectif)
> Reservation (#Id_Reservation, NoReservation, &Id_Salle, &Id_UE, &Id_Groupe, Nature)


Oui je suis d'accord que le type n'est pas judicieux mais mon problme ne rside pas dans cela.
L'attribut Formation dans UE n'est pas une cl trangre ?
Les cls trangres Groupe et Formation dans Reservation sont refrences par Groupe et Formation ou respectivement  par Groupe et Formation ( dans le sens o ils font rfrences  une partie de la cl ou toute la cl de Groupes ? car la cl de Groupes est compos)
Dans mon code de je ne sais pas quoi mettre aprs references


```

```

----------


## al1_24

Pour rpondre  ces questions, il faudrait connatre les rgles fonctionnelles qui rgissent ces informations...

----------


## escartefigue

Je confirme les propos de al1_24.

Il ne faut pas rflchir aux tables et aux clefs trangres, c'est une mauvaise approche.
Il faut rflchir aux rgles de gestion, les tables et les clefs trangres ne sont qu'une consquence de ces rgles de gestion.

Voyez dans les autres sujets  quel point ce sont bien les rgles de gestion qui structurent le modle de donnes et donc les tables

Par exemple ici :
https://www.developpez.net/forums/d2.../#post11812511

ou encore l :
https://www.developpez.net/forums/d2...s-cotisations/

----------


## Nathanz

> Pour rpondre  ces questions, il faudrait connatre les rgles fonctionnelles qui rgissent ces informations...


C'est un exercice qu'on m'a donn. Je ne pense pas que le but est de remettre en question le schma relationnel mais plutt de l'implmenter, je n'ai aucune rgle fonctionnel donn.
Donc avec du bon sens qu'elle serait les cls  rfrencer ?

----------


## al1_24

Mon bon sens et ma longue exprience me feront rclamer les rgles fonctionnelles ou au moins un modle conceptuel de donnes (MCD) avant de pouvoir implmenter des contraintes dans un quelconque schma...  ::roll:: 

Le but de l'exercice est peut-tre de mettre en vidence qu'il manque des informations pour aller au bout de la mise en uvre

----------


## Nathanz

D'accord merci. Dernires questions, un attribut peut tre rfrencer par une cl compos ?
Qu'elle est la diffrence en sql entre FOREIGN KEY et REFERENCES ?

----------


## escartefigue

> Qu'elle est la diffrence en sql entre FOREIGN KEY et REFERENCES ?


FOREIGN KEY permet de dclarer une clef trangre et REFERENCES permet de prciser  quelle colonne de quelle table cette clef trangre fait rfrence. REFERENCES fait partie de la dclarative FOREIGN KEY
Voici un exemple de MCD trs classique qui concerne les clients, leurs commandes, les lignes de ces commandes et les produits concerns par ces lignes.



Et le script correspondant  gnr automatiquement par le logiciel de modlisation (ici Looping) en fonction du choix du SGBD (ici j'ai choisi SQL server) :



```

```


On trouve dans ce script plusieurs dclaratives FOREIGN KEY qui parlent d'elles-mmes quand on regarde le MCD correspondant  :;): 




> D'accord merci. Dernires questions, un attribut peut tre rfrencer par une cl compos ?


Une FOREIGN KEY peut faire rfrence  plusieurs colonnes, mais ce sont plusieurs colonnes de la table T2 qui font rfrence au mme nombre de colonnes de mme type dans la table T1.

Si je reprend le mme modle de donnes, mais que je dcide d'identifier la commande relativement au client (prsence du R prs des cardinalits cot commande), j'obtiens ce nouveau modle (j'ai simplifi en supprimant les produits) :



Et le script correspondant, toujours pour SQL server, devient  son tour :



```

```


On voit cette fois une dclarative FK qui rfrence bien deux colonnes :
 FOREIGN KEY(CL_ident, CO_ident) REFERENCES CO_commande_1(CL_ident, CO_ident)

----------

