Je vais partager avec vous ma conception et elle est différente de vos deux conceptions en ce qu'elle nécessite une table pour chaque type d'entité. J'ai trouvé que la meilleure façon de décrire toute conception de base de données est via ERD, voici la mienne:
Dans cet exemple, nous avons une entité nommée employé . La table utilisateur contient les enregistrements de vos utilisateurs et entity et entity_revision sont deux tables qui contiennent l'historique des révisions pour tous les types d'entités que vous aurez dans votre système. Voici comment fonctionne cette conception:
Les deux champs de entity_id et revision_id
Chaque entité de votre système aura son propre identifiant d'entité. Votre entité peut subir des révisions, mais son entity_id restera le même. Vous devez conserver cet identifiant d'entité dans la table de vos employés (en tant que clé étrangère). Vous devez également stocker le type de votre entité dans la table des entités (par exemple «employé»). Maintenant, comme pour le revision_id, comme son nom l'indique, il garde une trace de vos révisions d'entité. Le meilleur moyen que j'ai trouvé pour cela est d'utiliser le employee_id comme votre revision_id. Cela signifie que vous aurez des identifiants de révision en double pour différents types d'entités, mais ce n'est pas un plaisir pour moi (je ne suis pas sûr de votre cas). La seule remarque importante à faire est que la combinaison de entity_id et de revision_id doit être unique.
Il existe également un champ d' état dans la table entity_revision qui indique l'état de la révision. Il peut avoir l' un des trois états: latest
, obsolete
ou deleted
(ne pas se fier à la date de révisions vous aide beaucoup pour booster vos requêtes).
Une dernière remarque sur revision_id, je n'ai pas créé de clé étrangère connectant employee_id à revision_id car nous ne voulons pas modifier la table entity_revision pour chaque type d'entité que nous pourrions ajouter à l'avenir.
INSERTION
Pour chaque employé que vous souhaitez insérer dans la base de données, vous ajouterez également un enregistrement à entity et entity_revision . Ces deux derniers enregistrements vous aideront à savoir par qui et quand un enregistrement a été inséré dans la base de données.
METTRE À JOUR
Chaque mise à jour d'un enregistrement d'employé existant sera implémentée sous forme de deux insertions, une dans la table des employés et une dans entity_revision. Le second vous aidera à savoir par qui et quand le dossier a été mis à jour.
EFFACEMENT
Pour supprimer un employé, un enregistrement est inséré dans entity_revision indiquant la suppression et terminée.
Comme vous pouvez le voir dans cette conception, aucune donnée n'est jamais modifiée ou supprimée de la base de données et, plus important encore, chaque type d'entité ne nécessite qu'une seule table. Personnellement, je trouve cette conception très flexible et facile à utiliser. Mais je ne suis pas sûr de vous car vos besoins peuvent être différents.
[METTRE À JOUR]
Ayant pris en charge les partitions dans les nouvelles versions de MySQL, je pense que ma conception est également dotée de l'une des meilleures performances. On peut partitionner la entity
table en utilisant le type
champ tout en partitionnant en entity_revision
utilisant son state
champ. Cela stimulera SELECT
de loin les requêtes tout en gardant la conception simple et propre.