Eu não uso phpmyadmin, mas eu começaria com
- uma restrição exclusiva em subject.name,
- uma restrição exclusiva no par {teachers.name, teacher.subject_id},
- uma restrição exclusiva em {events.venue, events.subject_id, events.teacher_id},
- uma restrição única no par {teachers.id, teacher.subject_id}.
Os três primeiros têm a ver com identidade; o último permite segmentar {teachers.id, teacher.subject_id} com uma restrição de chave estrangeira.
No caso geral, os nomes das pessoas não são únicos. Então você poderia tem dois professores com o mesmo nome que ensinam a mesma matéria. Como você pode abordar esse tipo de problema depende do aplicativo.
Então chaves estrangeiras
- de teacher.subject_id para subject.id e
- de {events.teacher_id, events.subject_id} para {teachers.id, teacher.subject_id}
Isso pelo menos lhe dará um erro se você tentar inserir nos eventos um professor com a matéria errada.
Você precisa usar o mecanismo INNODB para impor restrições de chave estrangeira. Outros motores irão analisá-los, mas ignorá-los.
As cláusulas FOREIGN KEY e REFERENCES são suportadas pelo mecanismo InnoDBstorage, que implementa ADD [CONSTRAINT [símbolo]] FOREIGN KEY[index_name] (...) REFERENCES ... (...). Consulte a Seção 14.6.6, “Restrições de InnoDBand FOREIGN KEY”. Para outros mecanismos de armazenamento, as cláusulas são analisadas, mas ignoradas.