Hallo zusammen,
habe hier eine grundsätzliche Frage zu Fremdschlüssel.
Bin Entwickler und schreibe diverse Client/server-Applikationen. Die Applikationen greifen grundsätzlich über SP’s auf die DB zu. Egal, ob Selektion, Update usw.
Die Daten sind eher Objekt-orientiert abgelegt, gekapselt in Schemata und eindeutig per id indiziert. Logisches Löschen vermeide ich im laufenden Betrieb, arbeite lieber mit einem Del-Flag(0/1). Aufgeräumt wird 2 oder 3mal im Jahr, reorganisieren und fertig. Dies funktioniert ganz gut. Die Struktur der Daten entspricht einem Schneeflockenschema.
Jetzt frage ich mich, ob ich nicht die Fremdschlüssel zu stark vernachlässige. Denn die richte ich eigentlich nie ein. Da die Daten kontrolliert per SP in die DB kommen, hatte ich auch noch nie Probleme mit der Selektion von Daten über Joins. Die Beziehungen zwischen meinen PrimaryKeys handhabe ich grundsätzlich über meine SP’s.
Ich definiere aber nie Foreign Keys. Auch Checks definiere ich nie. Constrains erst recht nicht, da die Daten stark gekapselt und eindeutig in der jeweiligen Tabelle sind.
Damit fahre ich wirklich sehr gut. Die Schnittstellen zur Applikation sind zentral, durch die SP’s, und die DB’s sind sehr gut wartbar.
Trotzdem, macht es mehr Sinn mit Foreign Keys zu arbeiten? Ist es für den Server besser Foreign Keys definiert zu haben, obwohl die Id einer andren Tabelle eh nur einmalig in der Untertabelle existiert?
Hallo!
Ein Realname wäre zum antworten ganz schön!
Constraints wie z. B. UNIQUE oder Foreign Key sind eher für die Integrität der Daten da und nicht so sehr für die Performance. Ein Unique-Index gibt dem Optimizer allerdings Hinweise über die Verteilung der Daten. Ein Index über die FK-Spalte unterstützt einen Lookup, wenn z. B. der Parent-Satz gelöscht werden soll.
Grundsätzlich verlasse ich mich beim DB-Design nie auf die Fehlerfreiheit irgendeiner Software und beuge Inkonsistenzen durch entsprechende Constraints vor. Nachteil ist, dass sich die Reihenfolge der Deletes/Inserts an den FK-Constraints orientieren muss.
Einen schönen Tag noch,
Christoph Muthmann
Microsoft SQL Server MVP