5 Stimmen

Dynamische Erstellung von Tabellen als Mittel zur Partitionierung: OK oder schlechte Praxis?

Ist es für eine Anwendung sinnvoll, Datenbanktabellen dynamisch als Mittel zur Partitionierung zu erstellen?

Nehmen wir an, ich habe eine große Tabelle "widgets" mit einer Spalte "userID", die den Eigentümer jeder Zeile identifiziert. Wenn diese Tabelle dazu neigt, sehr groß zu werden, wäre es dann sinnvoll, dass die Anwendung stattdessen für jeden neuen Benutzer eine neue Tabelle mit dem Namen "widgets_{username}" erstellt? Gehen Sie davon aus, dass die Anwendung immer nur die Widgets eines einzelnen Benutzers abfragen muss (d. h. es besteht keine Notwendigkeit, diese Benutzer-Widget-Tabellen miteinander zu verbinden).

Auf diese Weise würde die große Tabelle in leichter zu verwaltende Teile aufgeteilt, aber das scheint keine elegante Lösung zu sein. Meiner Meinung nach sollte das Datenbankschema definiert werden, wenn die Anwendung geschrieben wird, und alle Daten zur Laufzeit werden als Zeilen gespeichert, nicht als zusätzliche Tabellen.

Eine allgemeinere Frage: Ist die Änderung des Datenbankschemas zur Laufzeit überhaupt in Ordnung?

Edit : Diese Frage ist größtenteils hypothetisch; ich hatte ein ziemlich gutes Gefühl, dass das Erstellen von Tabellen zur Laufzeit keinen Sinn macht. Davon abgesehen haben wir in unserer Anwendung eine Tabelle mit Millionen von Zeilen. SELECTs funktionieren gut, aber Dinge wie das Löschen aller Zeilen, die einem bestimmten Benutzer gehören, können eine Weile dauern. Grundsätzlich bin ich auf der Suche nach einer soliden Begründung, warum das dynamische Erstellen einer Tabelle für jeden Benutzer nicht sinnvoll ist, wenn ich gefragt werde.

9voto

KM. Punkte 98297

NEIN, NEIN, NEIN!! Sprechen Sie mir jetzt nach, I will not do this because it will create many headaches and problems in the future! Datenbanken sind für große Informationsmengen ausgelegt. Sie verwenden Indizes, um die gesuchten Informationen schnell zu finden. phone book Wie effektiv ist der Index? Wäre es besser, für jeden Nachnamen ein eigenes Buch zu haben?

Dies bringt Ihnen keine Vorteile in Bezug auf die Leistung. Behalten Sie eine einzige Tabelle, aber achten Sie darauf, auf UserID zu indizieren, und Sie werden in der Lage sein, die Daten schnell zu erhalten. Wenn Sie die Tabelle jedoch aufteilen, wird es unmöglich/wirklich schwer, Informationen zu erhalten, die sich über mehrere Benutzer erstrecken, wie die Suche nach allen Benutzern für ein bestimmtes Widget, die Anzahl aller Widgets eines bestimmten Typs usw. Sie müssen jede Abfrage dynamisch erstellen lassen.

Wenn das Löschen von Zeilen langsam ist, sollten Sie das überprüfen. Über wie viele Zeilen auf einmal reden wir, 10, 1000, 100000? Was ist Ihr Cluster-Index für diese Tabelle? Könnten Sie ein "sanftes Löschen" verwenden, bei dem Sie eine Statusspalte durch UPDATE auf "D" setzen, um die Zeile als gelöscht zu kennzeichnen? Können Sie die Zeilen zu einem späteren Zeitpunkt mit weniger Datenbankaktivität löschen? Ist das Löschen langsam, weil es durch andere Aktivitäten blockiert wird? überprüfen Sie diese Punkte, bevor Sie die Tabelle auflösen.

3voto

Tony Andrews Punkte 125904

Nein, das wäre eine schlechte Idee. Einige DBMS (z. B. Oracle) erlauben jedoch die Partitionierung einer einzelnen Tabelle anhand der Werte einer Spalte, wodurch das Ziel erreicht werden kann, ohne dass zur Laufzeit neue Tabellen erstellt werden müssen. Allerdings ist es nicht "die Norm", Tabellen auf diese Weise zu partitionieren: Dies wird normalerweise nur in sehr großen Datenbanken gemacht.

2voto

H-Man2 Punkte 3009

Mit einem Index auf userID sollte nahezu die gleiche Leistung erbringen.

Meiner Meinung nach ist die Änderung des Datenbankschemas während der Laufzeit eine schlechte Praxis. Denken Sie zum Beispiel an Sicherheitsfragen...

1voto

Ist es für eine Anwendung sinnvoll, Datenbanktabellen zu erstellen dynamisch als Mittel zur Partitionierung zu erstellen?

Nein. (lächeln)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X