2009-12-23 14 views
5

Wenn Sie Min/Max/Avg-Abfragen ausführen, bevorzugen Sie Aggregationstabellen oder einfach quer durch einen Zeilenbereich in der Rohtabelle?Um zu aggregieren oder nicht zu aggregieren, ist dies die Designfrage des Datenbankschemas

Dies ist offensichtlich eine sehr offene Frage und es gibt keine richtige Antwort, also suche ich nur nach allgemeinen Vorschlägen der Leute. Angenommen, die Rohdatentabelle besteht aus einem Zeitstempel, einem numerischen Fremdschlüssel (z. B. einer Benutzer-ID) und einem Dezimalwert (z. B. einem Kaufbetrag). Nehmen Sie außerdem an, dass in der Tabelle Millionen von Zeilen vorhanden sind.

Ich habe beides getan und bin zerrissen. Auf der einen Seite haben Aggregationstabellen mir erheblich schnellere Abfragen gegeben, aber auf Kosten einer Zunahme von zusätzlichen Tabellen. Das Anzeigen der aktuellen Werte für einen aggregierten Bereich erfordert entweder das vollständige Zurücksetzen auf die Rohdatentabelle oder das Kombinieren feinkörnigerer Aggregationen. Ich habe festgestellt, dass im Anwendungscode zu verfolgen ist, welche Aggregationstabelle abgefragt wird, wenn mehr Arbeit, die man denkt, und Schemaänderungen erforderlich sind, da die ursprünglichen Aggregationsbereiche ausnahmslos nicht ausreichen ("Aber ich wollte sehen unsere Verkäufe über die letzten 3 Zahlungszeiträume! ").

Auf der anderen Seite kann die Abfrage von den Rohdaten strafend langsam sein, aber lässt mich sehr flexibel über die Datenbereiche sein. Wenn sich die Bereichsgrenzen ändern, ändere ich einfach eine Abfrage, anstatt Aggregationstabellen neu erstellen zu müssen. Ebenso benötigt der Anwendungscode weniger Aktualisierungen. Ich vermute, dass ich, wenn ich schlauer über meine Indizierung wäre (d. H. Immer gute Deckungsindizes zu haben), in der Lage wäre, die Strafe für die Auswahl aus den Rohdaten zu reduzieren, aber das ist keineswegs ein Allheilmittel.

Gibt es trotzdem das Beste aus beiden Welten?

+0

Für welche Datenbank ist das? –

+0

Ich verwende normalerweise MySQL, aber hoffentlich gelten die Tipps für alle SQL-Datenbanken. – pr1001

+0

@ pr1001: Es ist ein allgemeines Problem in gewissem Umfang, aber einige Datenbanken bieten Mechanismen, um dieses Problem zu erleichtern (z. B. Oracle "materialisierte Ansichten"), so dass dieses "richtig" zu einem Grad – skaffman

Antwort

3

Wir hatten das gleiche Problem und rannten in dieselben Probleme, in die Sie geraten waren. Am Ende haben wir unsere Berichterstattung auf Analysis Services umgestellt. Es gibt eine Lernkurve mit MDX und Analysis Services selbst, aber es war großartig. Einige der Vorteile, die wir gefunden haben, sind:

  1. Sie haben eine Menge Flexibilität für Abfragen, wie Sie wollen. Bevor wir hatten, um spezifische Aggregate zu bauen, , aber jetzt ein Würfel beantwortet alle unsere Fragen.
  2. Speicher in einem Würfel ist viel kleiner als die detaillierten Daten.
  3. Erstellen und Verarbeiten der Würfel dauert weniger Zeit und produziert weniger laden auf den Datenbankservern als die Aggregate tat.

Einige Nachteile:

  1. Es gibt eine Lernkurve um Erstellen von Cubes und Lernen MDX.
  2. Wir mussten einige Werkzeuge zu automatisieren, die mit den Würfeln arbeiten.

UPDATE: Da Sie MySql verwenden Sie einen Blick auf Pentaho Mondrian nehmen könnte, die eine Open-Source OLAP-Lösung ist, die MySQL unterstützt. Ich habe es jedoch nie benutzt, also weiß ich nicht, ob es für dich funktioniert oder nicht. Wäre daran interessiert zu wissen, ob es für dich funktioniert.

+0

+ datenbankspezifisch sein wird 1 für die Erwähnung von Pentaho. Einige der Leute, die an Pentaho beteiligt sind, stammen von Cognos BI. – cethegeek

0

Ich lehne mich immer in Richtung Rohdaten. Einmal aggregiert, können Sie nicht zurückgehen.
Nichts mit dem Löschen zu tun - es sei denn, es gibt die einfachste der aggregierten Datensätze, Sie können die Daten nicht genau zurück auf Rohdaten umkehren/transponieren.

Idealerweise würde ich eine materialisierte Ansicht verwenden (unter der Annahme, dass die Daten in die Integritätsbedingungen passen), da es sich tatsächlich um eine Tabelle handelt. Aber MySQL unterstützt sie nicht, daher wäre die nächste Überlegung eine Ansicht mit den berechneten Spalten oder ein Auslöser, um eine tatsächliche Tabelle zu aktualisieren.

+0

Habe ich den Teil vermisst, in dem er vorgeschlagen hat, die Originaldaten zu aggregieren und zu löschen? Natürlich müssen die Rohdaten behalten werden. Aber zusätzlich zu den Rohdaten können auch einige Aggregatdaten gespeichert werden. – marcc

+0

@ marcc: Wo habe ich gesagt, dass die ursprünglichen Daten gelöscht werden würden? –

+0

@Ponies: Vielleicht, wenn Sie gesagt, dass einmal aggregiert können Sie nicht zurück gehen :) –

0

Es hilft, einen guten Primärschlüssel auszuwählen (dh [user_id, used_date, used_time]). Für eine konstante user_id ist es dann sehr schnell eine Bereichsbedingung für used_date zu machen.

Wenn die Tabelle jedoch wächst, können Sie die Tabellengröße reduzieren, indem Sie eine Tabelle wie [user_id, used_date] aggregieren. Für jeden Bereich, in dem die Tageszeit keine Rolle spielt, können Sie diese Tabelle verwenden. Eine weitere Möglichkeit, die Tabellengröße zu reduzieren, besteht darin, alte Daten zu archivieren, die nicht mehr abgefragt werden dürfen.

Verwandte Themen