Ich habe eine Tabelle, die durch Fremdschlüssel in vielen anderen Tabellen referenziert wird. Wenn ich in meinem Programm eine dieser Zeilen löschen möchte, muss ich zunächst nach Abhängigkeiten suchen und sie dem Benutzer anzeigen - "Dieses Objekt hängt von x aus Tabelle y, z aus Tabelle q usw. ab". Außerdem erwarte ich, dass die Anzahl der Tabellen, die Fremdschlüssel zu dieser Tabelle haben, im Laufe der Zeit beträchtlich ansteigen wird.
Ist die Datenbank information_schema ein guter Weg, um nach allen Abhängigkeiten zu suchen? Ich habe versucht, eine Liste aller Tabellen abzufragen, die Fremdschlüssel zu meiner Tabelle haben, dann über das Ergebnis zu iterieren und alle Einträge aus jeder Tabelle auszuwählen, bei denen der Fremdschlüsselwert mit dem Wert übereinstimmt, den der Benutzer zu löschen versucht. Die Abfrage lautet wie folgt:
SELECT * FROM `KEY_COLUMN_USAGE` kcu
LEFT JOIN TABLE_CONSTRAINTS tc
ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE='FOREIGN KEY'
AND (kcu.REFERENCED_TABLE_SCHEMA='db')
AND (kcu.REFERENCED_TABLE_NAME = 'testtable')
was für die Bestimmung der zu durchsuchenden Tabellen perfekt funktioniert, aber es ist sehr langsam. Die Ausführung der Abfrage dauert auf meinem Entwicklungscomputer bestenfalls 1 bis 2 Sekunden. Wenn ich sie auf meinem Produktionsserver ausführe, verringert sich die Zeit erheblich, aber sie ist immer noch recht langsam.
Ich muss wissen, ob es eine schlechte Idee ist, information_schema auf diese Weise zu verwenden. Wenn nicht, wie kann ich eine bessere Leistung aus der Abfrage herausholen. Ist die Abfrage, die ich verwende, solide, oder gibt es einen besseren Weg, dies zu tun? Wenn ja, wie sollte ich dieses Problem unter dem Gesichtspunkt der Wartbarkeit am besten angehen.