Poproszono mnie o stworzenie czegoś, co śledzi dzienny koszt gromadzenia na kontach, i próbuję wymyślić schemat tabeli bazy danych, który by to obsługiwał.
Oto co wiem
- Firma ma ponad 2,5 miliona kont
- Spośród nich obecnie pracują średnio 200 000 miesięcznie (co zmienia się wraz z poziomem zatrudnienia, który jest obecnie niski)
- Mają 13 różnych rodzajów kosztów, które chcieliby śledzić, i ostrzegli, że mogą dodać więcej w przyszłości
- Chcą, aby koszty były śledzone codziennie
- Koszty nie są dzielone na cały asortyment. Są one podzielone na liczbę kont obsługiwanych miesięcznie (200 000) lub użytkownicy mogą wprowadzić identyfikatory kont, aby zastosować koszt do grupy kont, lub mogą po prostu określić, dla których kont zastosować koszt.
Moją pierwszą myślą była znormalizowana baza danych:
ID konta Data CostTypeId Ilość
Moim problemem jest robienie matematyki. Ten stół szybko się powiększy. Zakładając, że wszystkie 13 rodzajów kosztów zostanie zastosowanych do wszystkich obsługiwanych kont w bieżącym miesiącu, czyli 200k * 13 * N days in month
około 75-80 milionów rekordów miesięcznie lub blisko miliarda rekordów rocznie.
Moją drugą myślą było nieco zdenormalizować to
ID konta Data Całkowity koszt CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Ta metoda jest bardziej zdenormalizowana i może tworzyć do 6 milionów rekordów miesięcznie ( 200k * N days in month
) lub około 72 milionów rocznie. Jest to o wiele mniej niż pierwsza metoda, jednak jeśli firma zdecyduje się na nowy typ kosztów w przyszłości, konieczne będzie dodanie kolejnej kolumny bazy danych.
Z dwóch metod, które wolisz? Dlaczego? Czy istnieje inna alternatywa, która mogłaby wymyślić, która poradziłaby sobie z tym lepiej?
Najbardziej interesuje mnie raportowanie wyników, zarówno raportów letnich, jak i szczegółowych. Zadanie, które rozłoży koszty na konta, będzie wykonywane co noc, gdy nikogo nie będzie w pobliżu. Drugim problemem jest rozmiar bazy danych. Istniejąca baza danych ma już prawie 300 GB i uważam, że miejsce na dysku wynosi około 500 GB.
Baza danych to SQL Server 2005