web-dev-qa-db-fra.com

Meilleures pratiques pour l'histoire / Tables temporelles?

Supposons que j'ai un objet, avec certains domaines que je souhaite suivre l'historique et certains domaines que je ne souhaite pas suivre l'historique. D'une perspective de normalisation, le schéma suivant est-il correct:

CREATE TABLE MyObject AS (
    MyObjectId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectField1 VARCHAR(100) NOT NULL,
    MyObjectField2 VARCHAR(100) NOT NULL,
    MyObjectField3 VARCHAR(100) NOT NULL,
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)
CREATE TABLE MyObjectHistory AS (
    MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectId INT NOT NULL FOREIGN KEY REFERENCES MyObject(MyObjectId),
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)

où MyObjectHistory contient les champs suivis pour tous sauf la dernière révision. Ou, tous les champs de suivis doivent-ils être dans une seule table et toutes les révisions, y compris les dernières recommandations de ce tableau, comme dans:

CREATE TABLE MyObject AS (
    MyObjectId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectField1 VARCHAR(100) NOT NULL,
    MyObjectField2 VARCHAR(100) NOT NULL,
    MyObjectField3 VARCHAR(100) NOT NULL,
)
CREATE TABLE MyObjectHistory AS (
    MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectId INT NOT NULL FOREIGN KEY REFERENCES MyObject(MyObjectId),
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)
11
cubetwo1729

Il y a quelques raisons importantes du n ° 1. Le premier est la taille de la taille HLGEM souligne, mais il y en a d'autres importants.

Généralement, votre piste d'audit aura lieu aux exigences dans le temps. Vous voudrez peut-être finir par vouloir suivre les utilisateurs de la base de données, le temps de changement, etc. Les exigences du trail d'audit et votre table principale seront susceptibles de changer au fil du temps de manière indépendante. Enfin, vous voudrez probablement purger les données de piste d'audit après une période de temps indépendamment et une table entièrement séparée.

Bien sûr, il peut y avoir des cas où vous souhaitez les fusionner intégralement (comme pour les taux d'imposition dans LEDGERSMB), car les données historiques peuvent être utilisées pour les calculs actuels et le nombre d'enregistrements est susceptible d'être relativement petit.

Je vais cependant suggérer que cela stocke des objets dans des tables comme celui-ci conduit rarement à de bonnes conceptions normalisées. Dans mon expérience, vous voulez vraiment une encapsulation entre un bon stockage normalisé et un modèle d'objet d'application.

0
Chris Travers