Question

Tout ce que je parle à base de données relationnelle raconterai, MySQL spécifique.

J'ai un certain nombre de tables dans une base de données et un nombre modéré d'entre eux, je vais vouloir stocker un historique des valeurs records quand il change. Je l'ai vu cela dans un couple de différentes manières:

  1. Une table / un champ - Fondamentalement, il y a une table qui stockent l'histoire de toute la table que le stockage nécessaire d'histoire. Tous les changements sont enregistrés dans un champ en tant que type de données texte.
  2. Table par table / un champ -. Comme ci-dessus, sauf la chaque table a sa propre table d'histoire (. C.-à-projets / ProjectsHistory, Questions / IssuesHistory, etc ...)
  3. Tableau par table / Champ par champ - C'est comme ci-dessus dans la chaque table a sa propre table de histroy mais aussi la table de l'histoire a à peu près la même définition que la table régulière avec un supplément d'histoire supplémentaires des domaines connexes (updateDatetime , updateUserId, etc ...).

Quels sont les avantages et les inconvénients de ces différentes méthodes de stockage histoire d'enregistrement? Y at-il d'autres méthodes que je ne l'ai pas pensé?

Était-ce utile?

La solution

Puisque vous avez beaucoup de tables avec un nombre variable de colonnes, # 1 serait hors puisque vous auriez une table massive avec l'ensemble de vos colonnes, et beaucoup de valeurs nulles.

Entre # 2 & # 3 Je pense que vous avez une décision à prendre en ce qui concerne la complexité de la conception que vous souhaitez gérer. Selon moi, il serait plus facile de maintenir une réplique exacte des archives pour une table donnée, et stocker l'ensemble RowState (avec le temps modifié). Pensez à un cas où vous mettez à jour plus d'une colonne d'une ligne. Dans ce cas, # 2 serait enregistrer une entrée pour le changement des colonnes séparément, même si elle était la même transaction. Je vais w # 3 pour réduire la complexité et la capture point dans le temps l'état de la ligne.

Autres conseils

Vous voulez vraiment lire d'abord:

http://www.cs.arizona.edu/~rts/tdbbook. pdf

Si vous voulez garder votre histoire dans une table séparée (et probablement vous), vous voudrez probablement l'option n ° 3; il a tendance à être plus facile à mettre en œuvre et plus pratique, # 1 sont # 2 sont assez laids et « non-relationnel ».

Dans une certaine mesure cela dépend de la façon dont vous avez l'intention d'utiliser ces données. Si cela est une table de vérification utilisé strictement pour pouvoir faire des recherches de temps en temps qui ont changé quoi et quand et à l'occasion de restaurer les mauvaises modifications, puis l'option 2 est très bien. Si vous avez l'intention d'afficher l'historique de l'utilisateur à l'application ou par le biais de rapports, utilisez l'option 3. Je ne peux penser à aucun cas où j'utiliser l'option comme un beciomes un des endroits où le blocage se produit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top