CITATION(NiCoS @ dimanche 26 mars 2006, 11h13)
Hello,
Je suis en train de pondre mon MCD avec DBDesigner pour un projet PHP/MySQL et j'ai qqs questions :
Sauf erreur de ma part, DBDesigner ne permet pas de faire des MCD, mais uniquement des MPD.
Le MCd est un niveau d'abstraction plus haut que le MPD
CITATION(NiCoS @ dimanche 26 mars 2006, 11h13)
[*]Quand je lis une table à une autre, cette liaison est-elle forcément une clé étrangère ?
Non. Cela dépend du type de cardinalité que tu as des deux côtés de ton association.
Dans cet exemple, un jeu appartient à 0,n catégories ( pour être précis la cardinalité aurait dû être 1,n)
Une catégorie peut avoir entre 0,n jeux.
Dans ce cas tu auras, une table de liason dont la clé primaire est composé des deux clé primaire de la table jeu et de la table catégorie.
Le schéma ci-dessous sera un peu plus clair.

CITATION(NiCoS @ dimanche 26 mars 2006, 11h13)
[*]MySQL ne semble gérer les clés étrangères qu'avec les tables InnoDB - est-ce toujours le cas avec MySQL 4.x et quel est l'impact de choisir un type InnoDB plutôt que MyISAM ?
- Tu vas pouvoir gérer des clés étrangères avec quasiment n'importe quel SGBD. Tu peux gérer ça dés mySQL 3 et avec des tables myISAM.
Dans l'exemple ci-dessus, dans la table appartient tu as deux clé étrangères : IDJeu et IDCatégorie.
Généralement tu met des index sur ces champs, afin d'améliorer les performances lorsque tu feras des liaison entre tes tables.
- Lorsque tu parles de clé étrangère, tu fait peut-être référence à la notion d'intégrité référentielle. C'est à dire, si tu supprimme une catégorie, toutes les lignes de la table appartient doivent aussi être supprimmé.
Cette intégrité s'obtient avec des
contraintes d'intégrité référentielles, et des
triggers.
Cela n'existe effectivement en mySQL4 si tu reste en myIsam
Voici un exemple en mySQL5.0
CODE
/*==============================================================*/
/* Nom de SGBD : MySQL 5.0 */
/* Date de création : 25/03/2006 10:35:06 */
/*==============================================================*/
drop table if exists VILLA;
drop table if exists VILLE;
/*==============================================================*/
/* Table : VILLA */
/*==============================================================*/
create table VILLA
(
IDVILLA int not null auto_increment,
IDVILLE int not null,
SUPERFICE decimal,
PRIX decimal,
primary key (IDVILLA)
);
/*==============================================================*/
/* Table : VILLE */
/*==============================================================*/
create table VILLE
(
IDVILLE int not null auto_increment,
NOM longtext,
primary key (IDVILLE)
);
alter table VILLA add constraint FK_ASSOCIATION_1 foreign key (IDVILLE)
references VILLE (IDVILLE) on delete restrict on update restrict;
L'intégrité référentielle entre Villa et Ville est garantie grâce à la contrainte FK_ASSOCIATION_1.
CITATION(NiCoS @ dimanche 26 mars 2006, 11h13)
[*]Si je n'utilise pas de clé étrangère mais m'assure seulement d'avoir des liens logiques dans mes tables, hormis un surplus de programmation, qu'est-ce que je risque ? A l'inverse quels sont les impacts d'utiliser des clés étrangères ?
Merci d'avance

Si tu n'utilise pas les contraintes d'intégrité référentielle, ce n'est pas si grave que ça.
L'important est de mettre les bons indexs sur les champs qui te servent de liaison.
Si tu n'a pas de contraintes d'intégrité référentielle ce sera à toi de maintenir cette intégrité dans tes programmes afin de ne pas mettre ta base en vrac.
Les avis sont partagés sur l'utilisation ou non des triggers et des contraintes d'intégrité référentielle. Certains ne jurent que par ça, d'autres n'en veulent pas.
Le nom de contraintes est vraiment bien choisit :
CODE
add constraint
ajoute des contraintes sur ta base de donnée. Donc tu perd de la liberté.
C'est parfois enervant en mode dévloppement de vouloir supprimé des enregistrements avec phpMyAdmin, et qu c'est impossible à cause des contraintes référentielle.
Un mix que j'aime bien :
- en phase develop, je n'active pas les contraintes
- en production, j'essaye d'imposer ( c'est pas tjrs facile ) ,l'activation systématique de l'intégrité référentielle.
Conclusion : le risque de ne pas utilisé des contraintes de clé étrangères, n'est pas si grave que ça, si tu sais être rigoureux dans tes dev et dans ta manipulation de ta base.