Ich wurde gebeten, etwas zu erstellen, das die täglichen Kosten für das Sammeln auf Konten protokolliert, und ich versuche, ein Datenbanktabellenschema zu finden, das dies unterstützt.
Folgendes weiß ich
- Das Unternehmen hat über 2,5 Millionen Konten
- Davon arbeiten sie derzeit durchschnittlich 200.000 pro Monat (dies ändert sich mit dem Personalbestand, der derzeit niedrig ist).
- Sie haben 13 verschiedene Kostentypen, die sie verfolgen möchten, und sie haben gewarnt, dass sie in Zukunft weitere hinzufügen könnten
- Sie möchten, dass die Kosten täglich nachverfolgt werden
- Die Kosten werden nicht auf das gesamte Inventar aufgeteilt. Sie sind entweder auf die Anzahl der Konten aufgeteilt, die pro Monat bearbeitet werden (200.000), oder Benutzer können Konto-IDs eingeben, um Kosten auf eine Gruppe von Konten anzuwenden, oder sie können einfach angeben, auf welche Konten die Kosten angewendet werden sollen.
Mein erster Gedanke war eine normalisierte Datenbank:
AccountId Datum CostTypeId Menge
Mein Problem dabei ist, machen Sie die Mathematik. Dieser Tisch wird schnell riesig. Angenommen, alle 13 Kostentypen werden für den aktuellen Monat auf alle bearbeiteten Konten angewendet 200k * 13 * N days in month
, entspricht dies etwa 75 bis 80 Millionen Datensätzen pro Monat oder nahezu einer Milliarde Datensätzen pro Jahr.
Mein zweiter Gedanke war, es ein bisschen zu denormalisieren
AccountId Datum Gesamtkosten CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Diese Methode ist denormalisierter und kann bis zu 6 Millionen Datensätze pro Monat ( 200k * N days in month
) oder etwa 72 Millionen pro Jahr erstellen. Dies ist viel weniger als die erste Methode. Wenn sich das Unternehmen jedoch in Zukunft für einen neuen Kostentyp entscheidet, muss eine weitere Datenbankspalte hinzugefügt werden.
Welche der beiden Methoden bevorzugen Sie? Warum? Gibt es eine andere Alternative, die dies besser bewältigen könnte?
Am meisten interessiert mich die Berichterstattung über die Leistung, sowohl über zusammengefasste als auch über detaillierte Berichte. Der Job, der die Kosten auf die Konten verteilt, wird jede Nacht ausgeführt, wenn niemand in der Nähe ist. Ein sekundäres Anliegen ist die Datenbankgröße. Die vorhandene Datenbank ist bereits fast 300 GB groß, und ich glaube, der Speicherplatz auf der Festplatte beträgt etwa 500 GB.
Die Datenbank ist SQL Server 2005