2 Stimmen

Wie kann man am besten Daten aus mehreren Tabellen und Datenbanken abfragen?

Ich habe 5 Datenbanken, die verschiedene Regionen des Landes repräsentieren. In jeder Datenbank gibt es einige hundert Tabellen mit jeweils 10.000 bis 2.000.000 Transaktionsdatensätzen. Jede Tabelle repräsentiert einen Kunden in der jeweiligen Region. Jede dieser Tabellen hat das gleiche Schema.

Ich möchte alle Tabellen abfragen, als wären sie eine einzige Tabelle. Die einzige Möglichkeit, die ich mir vorstellen kann, ist die Erstellung einer Ansicht, die alle Tabellen vereint, und dann die Ausführung meiner Abfragen gegen diese. Die Kundentabellen ändern sich jedoch ständig (da wir Kunden hinzugewinnen und verlieren), so dass ich die Abfrage für meine Ansicht ändern müsste, um neue Tabellen einzubeziehen (oder solche zu entfernen, die nicht mehr verwendet werden).

Gibt es einen besseren Weg?

EDIT

Als Antwort auf die Kommentare (ich habe dies auch als Antwort auf eine Antwort gepostet):

In den meisten Fällen werde ich keine Tabellen entfernen, sondern sie werden zu historischen Zwecken beibehalten. Wie ich in einem Kommentar zu einer Antwort geschrieben habe, war die Idee, die Zeit zu reduzieren, die ein kleinerer Kunde (mit nur 10.000 Datensätzen) braucht, um seine eigene Historie abzufragen. Es gibt etwa 1000 Kunden mit durchschnittlich 1.000.000 Zeilen (und mehr) pro Stück. Wenn ich alle Datensätze zu einer Tabelle hinzufügen würde, hätte ich fast eine Milliarde Datensätze in dieser Tabelle. Ich dachte auch, dass ich für die Zukunft plane, dass wir bei 5000 Kunden nicht eine riesige Tabelle haben, die alle Transaktionsdatensätze enthält (vielleicht ist das ein Fehler in meinem Denken). Ist es also besser, die Datensätze nicht aufzuteilen, wie ich es getan habe? Sollte ich alles in einer Tabelle zusammenfassen? Wird die Indizierung von Kunden-IDs Verzögerungen bei der Abfrage von Daten für kleinere Kunden verhindern?

0 Stimmen

Klingt so, als ob Sie Tabellen auf der Grundlage der von Ihnen gewonnenen Kunden erstellen. Wenn das der Fall ist, haben Sie kein solides Datenbankdesign.

0 Stimmen

Ich wette, Sie haben alle Arten von verrückten dynamischen Abfragen. Ich würde eine Kundentabelle empfehlen, die eine ID, eine Region, einen Namen usw. definiert, und dann eine Transaktionstabelle, die diese Kunden-ID und alle Daten verwendet. Sie können dann Abfragen mit WHERE CustomerID=@x und .... schreiben, das ist ein viel besseres Design

7voto

Brann Punkte 30431

Ich glaube, Ihr Entwurf ist fehlerhaft. Warum verwenden Sie nicht eine einzige Tabelle mit einer Region und einer Kundenspalte?

An Ihrer Stelle würde ich eine Umstrukturierung zu einer einzigen Tabelle in Erwägung ziehen, und wenn nötig (z. B. aus Gründen der Rückwärtskompatibilität) würde ich Ansichten verwenden, um dieselben Informationen wie in den vorherigen Tabellen bereitzustellen.


Bearbeiten, um auf die Kommentare von OP zu diesem Beitrag zu antworten:

Eine Tabelle mit 10.000.000.000 Zeilen reicht völlig aus, vorausgesetzt, Sie verwenden eine angemessene Indexierung. Datenbankserver sind dafür ausgelegt, diese Art von Volumen zu bewältigen.

Die Leistung ist definitiv kein triftiger Grund, eine solche Tabelle in Tausende von kleineren aufzuteilen!

0 Stimmen

Die Idee war, dass Kunden bei der Abfrage ihrer eigenen Historie (z. B. einer mit nur 10.000 Datensätzen) nicht die Mühe auf sich nehmen müssen, 1.000.000.000 Zeilen abzufragen. Wenn ich alle Datensätze zu einer Tabelle hinzufügen würde, käme ich auf 1.000.000.000 Datensätze, und das scheint einfach unüberschaubar.

0 Stimmen

Nein, ist es nicht. Bei ordnungsgemäßer Indizierung sollte dies problemlos funktionieren. Und wenn der Kunde direkten Zugriff auf die Datenbank benötigt (aber natürlich nicht auf die Daten der anderen Kunden), können Sie das mit Ansichten behandeln.

0 Stimmen

Ein einfacher Test, um zu sehen, ob das Design gut ist: Ändern Sie Daten oder das Schema, wenn ein Kunde hinzugefügt/gelöscht wird. Wenn Sie das Schema ändern, ist es schlecht, wenn Sie Daten ändern, ist es gut. +1

2voto

Eoin Campbell Punkte 42038

Ich stimme mit Brann überein,

Das ist ein verrücktes DB-Schema-Design. Warum haben Sie nicht mit (oder ist eine Option zu ändern) eine einzige normalisierte Struktur mit Spalten, um nach Region und was auch immer Bedingung trennt jede Tabelle innerhalb einer Region Datenbank zu filtern gehen.

In dieser Struktur haben Sie es mit einer schrecklich großen (~500 Tabellen) vereinigten Ansicht zu tun, die Sie in regelmäßigen Abständen dynamisch neu generieren müssten, wenn neue Tabellen im System erscheinen.

0 Stimmen

Diese Möglichkeit gibt es auf jeden Fall. Das ist alles noch in der Planungsphase, die Kunden können die Daten noch nicht wirklich abfragen.

2voto

Chris Ballance Punkte 32892

Die Architektur dieses Systems riecht so, als ob es einen völlig anderen Ansatz braucht, wenn es um ein paar hundert Tische y jedes hat das gleiche Schema

Warum fügen Sie überhaupt Tabellen hinzu oder entfernen sie? Dies sollte unter normalen Umständen nicht passieren.

0voto

2 Lösungen 1. Schreiben Sie eine gespeicherte Prozedur, die die Ansicht für Sie erstellt, indem Sie alle Tabellennamen in den 5 Datenbanken analysiert und die Ansicht mit Union erstellt, wie Sie es von Hand tun würden.

  1. Erstellen Sie eine neue Datenbank mit einer Tabelle und importieren Sie jede Nacht pro Beispiel alle Datensätze aller Tabellen in diese Datenbank.

0voto

jason saldo Punkte 9556

Klingt, als ob Sie irgendwo zwischen einer Multi- und einer Single-Tenant-Datenbank feststecken. Insbesondere Ihre Speicherung als "light" Multi-Tenant (separate Tabellen vs separate Datenbanken), aber es als Single-Tenant abfragen, eine Abfrage, um sie alle zu regieren.

Kurzfristig sollten Sie Ihre Datenzugriffsschicht dynamisch die abzufragende Tabelle auswählen und nicht alles für eine einzige Abfrage zusammenfassen.

Langfristig sollten Sie sich für einen Ansatz entscheiden und diesen beibehalten. Eine Datenbank und eine Tabelle oder viele Datenbanken.

Hier finden Sie einige Beiträge zu diesem Thema.

Was sind die Vorteile der Verwendung einer einzigen Datenbank für JEDEN Kunden?

http://msdn.microsoft.com/en-us/library/aa479086.aspx

0 Stimmen

Danke für den Kommentar, ich werde es mir ansehen. Im Moment denke ich, dass ich zu einer einzelnen Tabelle wechseln werde. Ich konnte mich einfach nicht mit dem Gedanken an die Abfrage von Milliarden von Datensätzen anfreunden.

0 Stimmen

Milliarden von Datensätzen können auch ein Problem sein, man muss sich nur entscheiden, was man will.)

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