Мене попросили створити щось, що відстежує щоденні витрати, що збираються на рахунках, і я намагаюся розробити схему таблиці баз даних, яка б це підтримувала.
Ось що я знаю
- У компанії понад 2,5 мільйона рахунків
- З них в даний час вони працюють в середньому 200 000 на місяць (що змінюється в залежності від рівня персоналу, який наразі низький)
- У них є 13 різних типів витрат, які вони хотіли б відстежувати, і вони попередили, що вони можуть додати більше у майбутньому
- Вони хочуть відстежувати витрати щодня
- Витрати не поділяються на весь інвентар. Вони або розділені на # облікових записів, які працюють на місяць (200 000), або користувачі можуть ввести ідентифікатори облікових записів, щоб застосувати вартість до групи облікових записів, або вони могли просто вказати, до яких облікових записів слід застосувати витрати.
Першою моєю думкою була нормалізована база даних:
Номер рахунку Дата CostTypeId Сума
Моя проблема з цим полягає в тому, щоб зробити математику. Ця таблиця швидко вийде величезна. Якщо припустити, що всі 13 типів витрат застосовуються до всіх відпрацьованих рахунків за поточний місяць, 200k * 13 * N days in month
це приблизно 75-80 мільйонів записів на місяць або близько мільярда записів на рік.
Друга моя думка полягала в тому, щоб трохи денормалізувати це
Номер рахунку Дата Загальна вартість Тип витрат1 CostType2 Тип витрат3 Тип витрат4 Тип витрат5 Тип витрат6 Тип витрат7 Тип витрат8 Тип витрат9 Тип витрат10 Тип витрат11 Тип витрат12 Тип витрат13
Цей метод є більш денормалізованим і може створювати до 6 мільйонів записів на місяць ( 200k * N days in month
), або близько 72 мільйонів на рік. Це набагато менше, ніж перший метод, проте якщо компанія в майбутньому зважиться на новий тип витрат, потрібно буде додати ще один стовпець бази даних.
З двох методів, яким ви віддаєте перевагу? Чому? Чи є інша альтернатива, яку ви можете придумати, яка б впоралася з цим краще?
Мене найбільше цікавлять звіти про результати роботи, як літній, так і детальний звіти. Робота, яка розподіляє витрати на рахунки, буде виконуватися вночі, коли нікого немає. Другою проблемою є розмір бази даних. В існуючій базі даних вже майже 300 ГБ, і я вважаю, що місце на диску становить близько 500 ГБ.
База даних - SQL Server 2005