Me pediram para criar algo que rastreie o custo diário a ser cobrado nas contas e estou tentando descobrir um esquema de tabela de banco de dados que suporte isso.
Aqui está o que eu sei
- A empresa possui mais de 2,5 milhões de contas
- Destes, eles trabalham atualmente em média 200.000 por mês (que muda com os níveis de pessoal, que atualmente são baixos)
- Eles têm 13 tipos de custo diferentes que gostariam de acompanhar e alertaram que podem adicionar mais no futuro
- Eles querem que os custos sejam rastreados diariamente
- Os custos não são divididos em todo o inventário. Eles são divididos pelo número de contas trabalhadas por mês (200.000), ou os usuários podem inserir identificadores de conta para aplicar um custo a um grupo de contas ou podem simplesmente especificar em quais contas aplicar o custo.
Meu primeiro pensamento foi um banco de dados normalizado:
AccountId Encontro CostTypeId Montante
Meu problema com isso é: faça as contas. Essa tabela ficará enorme rapidamente. Supondo que todos os 13 tipos de custo sejam aplicados a todas as contas trabalhadas do mês atual, isso 200k * 13 * N days in month
é algo em torno de 75 a 80 milhões de registros por mês ou quase um bilhão de registros por ano.
Meu segundo pensamento foi desnormalizar um pouco
AccountId Encontro Custo total CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Esse método é mais desnormalizado e pode criar até 6 milhões de registros por mês ( 200k * N days in month
), ou cerca de 72 milhões por ano. É muito menor que o primeiro método, no entanto, se a empresa decidir sobre um novo Tipo de Custo no futuro, outra coluna do banco de dados precisará ser adicionada.
Dos dois métodos, qual você prefere? Por quê? Existe outra alternativa que você possa imaginar que lidaria melhor com isso?
Estou mais interessado em relatar o desempenho, tanto no verão quanto nos detalhados. O trabalho que distribuirá os custos pelas contas será executado todas as noites quando não houver ninguém por perto. Uma preocupação secundária é o tamanho do banco de dados. O banco de dados existente já tem quase 300 GB e acredito que o espaço em disco seja de cerca de 500 GB.
O banco de dados é SQL Server 2005