Quelle est la meilleure pratique pour stocker des métadonnées d'enregistrements individuels dans une base de données?
J'ai besoin de stocker des métadonnées communes telles que l'heure de création et l'heure de la dernière mise à jour de nombreuses tables dans ma base de données. J'ai trouvé quelques solutions différentes:
Stockez les métadonnées directement dans les tableaux.
Avantages:
- Les métadonnées sont directement liées aux enregistrements
- Aucune jointure n'est requise pour récupérer les métadonnées
Les inconvénients:
- Un grand nombre de colonnes en double sont requises (sauf si l'héritage est utilisé)
- Les métadonnées et les données d'entreprise ne sont pas séparées
Créez une table de métadonnées générale avec et utilisez des clés étrangères programmables pour lier les données aux tables et enregistrements appropriés.
Avantages:
- Pas de duplication des colonnes
- Les métadonnées sont séparées des données d'entreprise
Les inconvénients:
- Aucun lien direct entre les métadonnées et les données (les FK ne peuvent pas être utilisés)
- Les jointures nécessitent une condition supplémentaire
Créez des tables de métadonnées individuelles pour chaque table nécessitant des métadonnées.
Avantages:
- Les métadonnées sont directement liées aux enregistrements
- Les métadonnées sont séparées des données d'entreprise
Les inconvénients:
- Beaucoup de tables supplémentaires sont nécessaires
- Un grand nombre de colonnes en double sont requises (sauf si l'héritage est utilisé)
Y a-t-il plus d'options, d'avantages ou d'inconvénients que ceux que j'ai mentionnés ici? Et quelle est la meilleure pratique pour stocker ces métadonnées?
hstore
ouJSON
pourrait résoudre votre problème?Réponses:
Les colonnes dont vous parlez occupent 20 octets (si alignées sans remplissage):
horodatage .. 8 octets
horodatage .. 8 octets
entier .. 4 octets
L'en-tête de tuple et le pointeur d'élément pour une ligne distincte dans une table distincte occuperaient à eux seuls 23 + 1 + 4 = 28 octets plus les 20 octets de données réelles, plus 4 octets de remplissage à la fin. Donne 52 octets par ligne . En savoir plus ici:
Concernant le stockage, vous n'avez rien à gagner. En ce qui concerne les performances, vous ne perdez pratiquement rien avec seulement 16 à 24 octets de plus par ligne.
Les colonnes appartiennent également directement à la ligne, il est donc logique de les garder ensemble. Je prends l'habitude d'ajouter exactement de telles colonnes (plus une source distincte pour la dernière mise à jour) à toutes les tables pertinentes.
Il est également plus facile d'écrire un
TRIGGER ON INSERT OR UPDATE
pour les garder à jour.Pour faire court: un vote fort pour votre option 1 .
Où j'irais pour l' option 3 :
si les métadonnées sont mises à jour souvent, alors que la ligne principale ne l'est pas. Ensuite, il pourrait être avantageux de conserver une table 1: 1 distincte pour réduire les mises à jour et réduire les ballonnements sur la table principale - ou même opter pour l'option 2.
Où irais-je pour l' option 2 :
si l'ensemble des colonnes de métadonnées est hautement répétitif. Vous pouvez avoir une colonne FK pour l'ensemble des métadonnées dans les tables principales. N'économise pas beaucoup pour trois petites colonnes comme dans votre exemple.
la source