On m'a demandé de créer quelque chose qui suit le coût quotidien à percevoir sur les comptes, et j'essaie de trouver un schéma de table de base de données qui prendrait en charge cela.
Voici ce que je sais
- La société compte plus de 2,5 millions de comptes
- Parmi ceux-ci, ils travaillent actuellement en moyenne 200 000 par mois (cela change avec les niveaux de dotation, qui sont actuellement faibles)
- Ils ont 13 types de coûts différents qu'ils aimeraient suivre, et ils ont averti qu'ils pourraient en ajouter d'autres à l'avenir
- Ils veulent que les coûts soient suivis quotidiennement
- Les coûts ne sont pas répartis sur l'ensemble de l'inventaire. Ils sont répartis sur le nombre de comptes travaillés par mois (200 000), ou les utilisateurs peuvent saisir des identifiants de compte pour appliquer un coût à un groupe de comptes, ou ils peuvent simplement spécifier à quels comptes appliquer le coût.
Ma première pensée a été une base de données normalisée:
Identifiant de compte Date CostTypeId Montant
Mon problème avec ceci est, faites le calcul. Ce tableau va devenir énorme rapidement. En supposant que les 13 types de coûts soient appliqués à tous les comptes actifs pour le mois en cours, c'est-à 200k * 13 * N days in month
-dire environ 75 à 80 millions d'enregistrements par mois, soit près d'un milliard d'enregistrements par an.
Ma deuxième pensée a été de le dénormaliser un peu
Identifiant de compte Date Coût total CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
Cette méthode est plus dénormalisée et peut créer jusqu'à 6 millions d'enregistrements par mois ( 200k * N days in month
), soit environ 72 millions par an. C'est beaucoup moins que la première méthode, mais si l'entreprise décide d'un nouveau type de coût à l'avenir, une autre colonne de base de données devra être ajoutée.
Des deux méthodes, laquelle préférez-vous? Pourquoi? Y a-t-il une autre alternative à laquelle vous pourriez penser qui gérerait mieux cela?
Je suis plus intéressé par les rapports de performance, à la fois les rapports résumés et détaillés. Le travail qui répartira les coûts sur les comptes sera exécuté tous les soirs lorsque personne n'est présent. Une préoccupation secondaire est la taille de la base de données. La base de données existante fait déjà près de 300 Go, et je pense que l'espace sur le disque est d'environ 500 Go.
La base de données est SQL Server 2005