Меня попросили создать что-то, что отслеживало бы ежедневную стоимость сбора на счетах, и я пытаюсь выяснить схему таблицы базы данных, которая бы это поддерживала.
Вот что я знаю
- Компания имеет более 2,5 миллионов счетов
- Из них в настоящее время они работают в среднем 200 000 человек в месяц (что зависит от уровня персонала, который в настоящее время является низким)
- У них есть 13 различных типов затрат, которые они хотели бы отслеживать, и они предупредили, что могут добавить больше в будущем
- Они хотят, чтобы расходы отслеживались ежедневно
- Затраты не распределяются по всему инвентарю. Они либо распределяются по количеству учетных записей, работающих в месяц (200 000), либо пользователи могут вводить идентификаторы учетных записей, чтобы применить стоимость к группе учетных записей, или они могут просто указать, к каким учетным записям применять стоимость.
Моей первой мыслью была нормализованная база данных:
AccountId Дата CostTypeId Количество
Моя проблема с этим, сделать математику. Этот стол станет огромным быстро. Предполагая, что все 13 типов затрат применяются ко всем работающим учетным записям в текущем месяце, это 200k * 13 * N days in month
примерно 75-80 миллионов записей в месяц или почти миллиард записей в год.
Моя вторая мысль была немного денормализовать
AccountId Дата Общая стоимость CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Этот метод более денормализован и может создавать до 6 миллионов записей в месяц ( 200k * N days in month
), или около 72 миллионов в год. Это намного меньше, чем в первом методе, однако, если в будущем компания примет решение о новом типе затрат, потребуется добавить еще один столбец базы данных.
Из двух методов, которые вы предпочитаете? Почему? Есть ли другая альтернатива, о которой вы могли бы подумать, которая бы справилась с этим лучше?
Меня больше всего интересуют отчеты об исполнении, как обобщенные, так и подробные отчеты. Работа, которая будет распределять расходы по счетам, будет выполняться ночью, когда никого нет рядом. Вторая проблема - размер базы данных. Существующая база данных уже почти 300 ГБ, и я считаю, что место на диске составляет около 500 ГБ.
База данных SQL Server 2005