Je conçois mon schéma de base de données avec MySQL Workbench, ce qui est très pratique car vous pouvez créer des diagrammes et les convertir: P
Quoi qu'il en soit, j'ai décidé d'utiliser InnoDB en raison de la prise en charge de la clé étrangère. Une chose que j’ai remarquée cependant est qu’elle vous permet de définir les options On Update et Delete pour les clés étrangères. Quelqu'un peut-il expliquer où "Restrict", "Cascade" et set null pourraient être utilisés dans un exemple simple?
Par exemple, disons que j'ai une table user
qui inclut un userID
. Et disons que j'ai une table de messages message
qui est un plusieurs-à-plusieurs qui a 2 clés étrangères (qui référencent la même clé primaire, userID
dans la table user
.). La définition des options On Update et On Delete est-elle utile dans ce cas? Si oui, lequel dois-je choisir? Si ce n'est pas un bon exemple, pourriez-vous, s'il vous plaît, trouver un bon exemple pour illustrer leur utilité?
Merci
N'hésitez pas à mettre des contraintes sur la base de données. Vous serez sûr d'avoir une base de données cohérente, et c'est l'une des bonnes raisons d'utiliser une base de données. Surtout si vous avez plusieurs applications qui le demandent (ou une seule application mais avec un mode direct et un mode batch utilisant des sources différentes).
Avec MySQL, vous n’avez pas de contraintes avancées comme dans postgreSQL, mais au moins les contraintes de clé étrangère sont assez avancées.
Prenons un exemple, une table de société avec une table d’utilisateur contenant des personnes de cette société.
CREATE TABLE COMPANY (
company_id INT NOT NULL,
company_name VARCHAR(50),
PRIMARY KEY (company_id)
) ENGINE=INNODB;
CREATE TABLE USER (
user_id INT,
user_name VARCHAR(50),
company_id INT,
INDEX company_id_idx (company_id),
FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;
Regardons la clause ON UPDATE :
Et maintenant du côté ON DELETE :
la valeur par défaut est généralement: ON DELETE RESTRICT ON UPDATE CASCADE . avec quelques ON DELETE CASCADE
pour les tables de pistes (journaux - pas tous les journaux, etc.) et ON DELETE SET NULL
lorsque la table principale est un "attribut simple" pour la table contenant la clé étrangère, comme un Table JOB pour la table USER.
Modifier
Cela fait longtemps que j'ai écrit ça. Maintenant, je pense que je devrais ajouter un avertissement important. MySQL a une grosse limitation documentée avec les cascades. Les cascades ne déclenchent pas de déclencheurs . Donc, si vous étiez trop confiant dans ce moteur pour utiliser les déclencheurs, évitez les contraintes en cascades.
Les déclencheurs MySQL s'activent uniquement pour les modifications apportées aux tables par les instructions SQL. Ils ne s'activent pas pour les modifications de vues, ni par les modifications de tables effectuées par des API qui ne transmettent pas d'instructions SQL au serveur MySQL.
==> Voir ci-dessous la dernière modification, les choses bougent sur ce domaine
Les déclencheurs ne sont pas activés par des actions de clé étrangère.
Et je ne pense pas que cela sera réglé un jour. Les contraintes de clé étrangère sont gérées par le stockage InnoDb et les déclencheurs par le moteur MySQL SQL. Les deux sont séparés. Innodb est le seul stockage avec gestion des contraintes. Peut-être ajouteront-ils des déclencheurs directement dans le moteur de stockage un jour, peut-être pas.
Mais j’ai ma propre opinion sur l’élément à choisir entre la mise en œuvre médiocre du déclencheur et le très utile support des contraintes de clés étrangères. Et une fois que vous serez habitué à la cohérence de la base de données, vous adorerez PostgreSQL.
comme indiqué par @IstiaqueAhmed dans les commentaires, la situation a changé à ce sujet. Alors suivez le lien et vérifiez la situation actuelle (qui pourrait changer à nouveau dans le futur).
Ajout à la réponse @MarkR - une chose à noter serait que de nombreux frameworks PHP avec ORM ne reconnaissent pas ou n'utilisent pas la configuration DB avancée (clés étrangères, suppression en cascade, contraintes uniques), ce qui peut entraîner un comportement inattendu. .
Par exemple, si vous supprimez un enregistrement à l'aide d'ORM et que votre DELETE CASCADE
supprimera les enregistrements des tables associées, la tentative de suppression de ces enregistrements associés (souvent automatique) entraînera une erreur.
Vous devrez considérer cela dans le contexte de l'application. En général, vous devez concevoir une application et non une base de données (la base de données faisant simplement partie de l'application).
Réfléchissez à la manière dont votre demande devrait répondre à divers cas.
L’action par défaut consiste à limiter (c’est-à-dire à ne pas autoriser) l’opération, ce qui est normalement ce que vous voulez, car elle évite les erreurs de programmation stupides. Cependant, sur DELETE CASCADE peut également être utile. Cela dépend vraiment de votre application et de la manière dont vous souhaitez supprimer des objets particuliers.
Personnellement, j'utiliserais InnoDB car il ne détruit pas vos données (par exemple, MyISAM), plutôt que parce qu'il a des contraintes FK.