Mi è stato chiesto di creare qualcosa che tenga traccia dei costi giornalieri da riscuotere sugli account e sto cercando di capire uno schema di tabella del database che lo supporti.
Ecco quello che so
- La società ha oltre 2,5 milioni di account
- Di questi, attualmente lavorano in media 200.000 al mese (che cambia con i livelli di personale, che sono attualmente bassi)
- Hanno 13 diversi tipi di costo che vorrebbero tenere traccia e hanno avvertito che potrebbero aggiungerne altri in futuro
- Vogliono che i costi vengano tracciati quotidianamente
- I costi non sono suddivisi in tutto l'inventario. Sono suddivisi tra il numero di account che vengono elaborati al mese (200.000) oppure gli utenti possono inserire identificatori di account per applicare un costo a un gruppo di account o semplicemente specificare a quali account applicare il costo.
Il mio primo pensiero è stato un database normalizzato:
Account ID Data CostTypeId Quantità
Il mio problema con questo è, fare i conti. Questa tabella diventerà enorme rapidamente. Supponendo che tutti i 13 tipi di costo vengano applicati a tutti i conti lavorati per il mese corrente, ovvero 200k * 13 * N days in month
circa 75-80 milioni di record al mese, o quasi un miliardo di record all'anno.
Il mio secondo pensiero era di denormalizzarlo un po '
Account ID Data Costo totale CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Questo metodo è più denormalizzato e può creare fino a 6 milioni di record al mese ( 200k * N days in month
), o circa 72 milioni all'anno. È molto meno del primo metodo, tuttavia se la società decide in futuro un nuovo tipo di costo, sarà necessario aggiungere un'altra colonna del database.
Dei due metodi, quale preferisci? Perché? C'è un'altra alternativa a cui puoi pensare che gestirà meglio?
Sono più interessato a riportare le prestazioni, sia i rapporti estivi che quelli dettagliati. Il lavoro che distribuirà i costi sui conti verrà eseguito ogni notte quando non c'è nessuno in giro. Una preoccupazione secondaria è la dimensione del database. Il database esistente ha già quasi 300 GB e credo che lo spazio su disco sia di circa 500 GB.
Il database è SQL Server 2005