Je n'utilise pas phpmyadmin, mais je commencerais par
- une contrainte unique sur subject.name,
- une contrainte unique sur la paire {enseignants.nom, enseignants.subject_id},
- une contrainte unique sur {events.venue, events.subject_id, events.teacher_id},
- une contrainte unique sur la paire {enseignants.id, enseignants.subject_id}.
Les trois premiers ont à voir avec l'identité; le dernier vous permet de cibler {teachers.id,teachers.subject_id} avec une contrainte de clé étrangère.
Dans le cas général, les noms des personnes ne sont pas uniques. Alors vous pourriez avoir deux professeurs du même nom qui enseignent la même matière. La façon dont vous pourriez aborder ce type de problème dépend de l'application.
Puis les clés étrangères
- de enseignants.subject_id à subject.id, et
- de {events.teacher_id, events.subject_id} à {teachers.id, enseignants.subject_id}
Cela vous donnera au moins une erreur si vous essayez d'insérer dans les événements un enseignant avec le mauvais sujet.
Vous devez utiliser le moteur INNODB pour appliquer des contraintes de clé étrangère. D'autres moteurs les analyseront, mais les ignoreront.
Les clauses FOREIGN KEY et REFERENCES sont prises en charge par le moteur InnoDBstorage, qui implémente ADD [CONSTRAINT [symbole]] FOREIGN KEY[index_name] (...) REFERENCES ... (...). Voir Section 14.6.6, « Contraintes de clé étrangère InnoDBand ». Pour les autres moteurs de stockage, les clauses sont analysées mais ignorées.