Récemment, je pense aux meilleures pratiques avec stocker des données historiques dans la base de données MySQL. Pour l'instant, chaque table en version a deux colonnes - valide_from code> et valide_to code>, les deux DateTime code> type. Les enregistrements avec les données actuelles ont valide_from code> rempli de sa journée de création. Lorsque je mettez à jour cette ligne, je remplis valide_to code> avec la date de mise à jour et ajoutez un nouvel enregistrement avec valide_from code> identique que valide_to code> dans la ligne précédente - des trucs faciles. Mais je sais que cette table sera énorme très rapide alors la récupération de données peut être très lente.
J'aimerais savoir si vous avez des pratiques avec stocker des données historiques? P>
3 Réponses :
C'est une erreur commune de s'inquiéter des "grandes" tables et performances. Si vous pouvez utiliser des index pour accéder à vos données, cela ne comporte pas vraiment si vous avez 1000 enregistrements 1000000 - du moins pas aussi que vous pourrez mesurer. La conception que vous mentionnez est couramment utilisée; C'est un excellent design où le temps est un élément clé de la logique commerciale. p>
Par exemple, si vous voulez savoir ce que le prix d'un élément était au point lorsque le client a placé la commande, être capable de rechercher des enregistrements de produits dans lesquels valide_from Ce n'est pas toujours le cas - si vous conservez les données autour des archives, il peut être plus logique de créer des tables d'archives. Cependant, vous devez être sûr que le temps est vraiment em> ne faisant pas partie de la logique commerciale, sinon la douleur de la recherche de tables multiples sera importante - imaginez avoir à rechercher la table du produit ou la table Product_Archive à chaque fois Vous voulez découvrir le prix d'un produit au point que la commande a été placée. p>
Ce n'est pas une réponse complète, juste quelques suggestions. P>
Vous pouvez ajouter un champ booléen indexé comme En général - Stockage des données historiques dans la table Seprate peut compliquer votre candidature (il suffit d'imaginer une complexité de requête censée obtenir des données avec des archives mixtes et historiques ...). P>
Aujourd'hui, les ordinateurs sont vraiment rapides. Je pense que vous devriez comparer / tester les performances avec une table unique et une table séparée pour les archives historiques. p>
En outre - essayez de tester votre matériel pour voir à quel point MySQL est rapide avec de grandes tables pour déterminer comment concevoir la base de données. Si c'est trop lent pour vous - vous pouvez syntoniser la configuration MySQL (commencez par augmenter le cache / la RAM). P> is_valid code>. Cela devrait améliorer les performances avec une grande table avec des enregistrements historiques et actuels. P>
Je vois à l'achèvement d'une application qui fait exactement cela. La plupart de mes index indexés par des champs clés d'abord, puis le champ Dans les cas où vous pourriez avoir beaucoup plus d'enregistrements expirés de différentes clés que les enregistrements de courant, il peut payer à index sur valide_to avant em> tous les champs clés. P> valide_to code> défini sur null code> pour les enregistrements actuels, permettant ainsi aux enregistrements actuels d'être trouvés facilement et instantanément. Étant donné que la plupart de mes applications traitent des opérations en temps réel, les index fournissent des performances rapides. Une fois de temps en temps, quelqu'un a besoin de voir des archives historiques et, dans ce cas, il y a une performance touchée, mais de tester ce n'est pas trop grave car la plupart des enregistrements n'ont pas beaucoup de changements sur leur vie. P>
Faites des archives, c'est-à-dire déplacer des données historiques vers une table différente et gardez le courant de table actuel.
@Pradeeppati Cela compliquera énormément l'application s'il a besoin de requêtes capables de sélectionner des données historiques et actuelles. Cependant, il peut faire des vues pour "fusionner" les tables historiques et actuelles.
@ Kamil, cela ne compliquera vraiment rien, plutôt à garder l'application Sane. Vous avez besoin d'une histoire, vous allez sur la table d'historique, vous avez besoin de données actuelles, allez à la table actuelle.