0

Sagen wir, ich habe eine Tabelle, in der viele Felder mit Werten aus anderen "Wertetabellen" verknüpft sind. Natürlich erkläre ich für jeden die Fremdschlüssel-Beschränkungen und beteuerte sie, um Integrität zu erzwingen.Ist es von Nachteil, wenn eine Tabelle viele (20+) Fremdschlüsseleinschränkungen hat?

Was ist, wenn ich endlich die Anzahl solcher Felder im Bereich von 20-30 bekomme? Wird es irgendwie "verlangsamen" Tabellenoperationen oder nicht wirklich?

ZUSäTZLICH: Wertetabellen werden voraussichtlich nur wenige Aufzeichnungen haben, in der Regel 5-10 oder so etwas. Die Datenbank ist SQL Server 2008.

Antwort

1

ein Fremdschlüssel verlangsamt Mit insert/update Operationen gegen Null Fremdschlüssel mit - nur weil Datenbank zu überprüfen hat, dass Fremdschlüsselwert tatsächlich vorhanden ist. Wenn Sie 30 Fremdschlüssel haben, ist das langsamer, als wenn Sie keine haben.
Das heißt, wie viel langsamer es wird hängt von vielen Dingen ab, einschließlich der Größe Ihrer Werttabellen/Datenbank-Engine, die Sie verwenden/Indizes/etc ... und möglicherweise im besten Fall praktisch vernachlässigbar.

1

Ja, es gibt einige Leistungseinbußen bei Einfügungen und Aktualisierungen, da alle relevanten Einschränkungen überprüft werden, es ist jedoch unwahrscheinlich, dass Probleme auftreten, es sei denn, Sie versuchen, Daten mit hoher Geschwindigkeit einzufügen. In der Regel ist es wichtiger, dass die Daten korrekt und nicht schnell verwaltet werden, so dass sich die Strafe lohnt.

Wenn Sie ein Update von wenigen Spalten ausführen, nur die Einschränkungen für diese Spalten müssen geprüft werden, und die meisten DBMS wird nur die Einschränkungen überprüfen.

SELECT-Anweisungen werden natürlich nicht verlangsamt, und in einigen (wahrscheinlich seltenen) Fällen könnte sogar davon profitieren, dass der Optimierer die Fremdschlüsselbeziehung zwischen zwei Tabellen kennt, die verbunden werden.

2

Wenn Sie eine Zeile in Ihrem Kind Tabelle einfügen, sieht die DB-Engine, wenn die entsprechenden Werte in den übergeordneten Tabellen nach oben existieren -, dass einige CPU aufbrauchen und einige logische liest. Wenn Ihre Elterntabellen klein sind, befinden sie sich höchstwahrscheinlich im Cache. Sie würden also nicht viele langsame physische Lesevorgänge erwarten, sobald Ihr Stock warm ist.

Was mich mehr betrifft ist, wenn Sie jemals von Ihren Elterntabellen löschen werden: Wenn Sie keinen entsprechenden Index für Ihre Kindtabelle haben, wird die ganze Kindtabelle gesperrt und gescannt. Wenn Sie jedoch über entsprechende Indizes für alle Fremdschlüssel verfügen, erhalten Sie möglicherweise bis zu 20-30 zusätzliche Indizes für Ihre untergeordnete Tabelle, was eine erhebliche Verlangsamung darstellt.

Vielleicht möchten Sie Ihre eigenen Benchmarks ausführen und selbst sehen.

0

Von den 20-30 Feldern, wie viele werden selten benutzt? Vielleicht könnte ein anderer Tisch gebaut werden. Es macht es schwieriger, zwei Tabellen aus einer Codierperspektive zu aktualisieren, würde aber die Dinge beschleunigen, wenn Sie die meiste Zeit die zweite Tabelle nicht aktualisieren können.

ich mit einem 3rd-Party-App beschäftigen, die Haupttabellen mit entsprechenden ‚custom‘ Tabellen hat, wo wir können unsere eigenen Felder Setup. Leider verwenden wir die "benutzerdefinierten" Felder die ganze Zeit und kommen nur selten mit der Haupttabelle zurecht.

0

Ich denke, es wird auf abhängen, ob Ihre Abfragen eine der contraints verwenden. Wenn Ihre Abfrage aufgrund einer Einschränkung eine andere Tabelle überprüfen muss, wird ein Leistungseinbruch angezeigt. Wenn Ihre Abfrage keine Spalten in den Beschränkungen referenziert, wird der Leistungseinbruch wahrscheinlich vernachlässigbar sein.

0

Wie die meisten alles Datenbank-Design verwandt, ist dies 'abhängig.'Wenn Ihre Anwendung schwer einfügen, aktualisieren und löschen Sie laufen auf Leistungsprobleme. Dies könnte ein Fall sein, in dem eine Entnormalisierung gerechtfertigt sein könnte, insbesondere wenn sich die "Wert" -Tabellen nicht ändern.