3 votes

Entité avec versioning : manière optimale d'obtenir une liste de la dernière version en utilisant SQL

La question porte sur SQL sur SQL Server 2012.

Le contexte :

Il existe une entité appelée Entité .

Entité peut avoir N EntityVersion ( 1:n ).

EntityVersion peut être approuvé ou non. Si elle est approuvé un attribut ApprovedBy sera attribué dans l'ensemble version .

Exigence :

Il y a l'obligation de répertorier les dernières les versions des entités de tous entités mais uniquement la dernière version approuvée de chaque entité.

Problème :

Je dois trouver un moyen optimal de réaliser l'ensemble de la requête pour une solution à grande échelle.

Pour cette raison, j'ai pensé à deux approches possibles :

  1. colonne de drapeaux IsLast sur EntityVersion . A chaque fois qu'une nouvelle version est ajoutée, l'ensemble de la transaction sera fixé true à la nouvelle version ajoutée, et la version précédente dernière version seront affectés à false .

  2. Une gâchette qui traitera chaque nouvelle version de l'entité et ajoutera la nouvelle version à un tableau spécial qui ne contiendra que les dernières versions. Chaque fois qu'une nouvelle version est ajoutée, la version précédente est supprimée de la table spéciale. C'est-à-dire que le SELECT pour obtenir la liste complète sera très bon marché.

Question :

Quelle pourrait être l'approche optimale et valable ? Avez-vous une autre approche en tête ?

Merci !

Notez que "optimal" signifie qu'il sera évolutif et qu'il fonctionnera avec des millions d'enregistrements. .



Mise à jour

Comme j'ai constaté que certains utilisateurs demandent, dans leurs réponses, comment est le schéma de l'interface utilisateur de l'interface utilisateur. Entity y EntityVersion je vais mieux les décrire.

  • Entité n'a pas d'information textuelle : juste un identifiant et des relations avec d'autres entités.

  • EntityVersion contient des informations textuelles et autres. Par exemple : Titre, Description, Auteur... Il est important de mentionner que EntityVersion n'a pas d'informations dupliquées de Entity .

La solution la plus simple serait d'avoir quelque chose comme une SELECT DISTINCT qui pourrait à la fois définir la colonne distincte et sélectionner d'autres colonnes dans la même requête. Malheureusement, pour autant que je sache, cela n'est pas possible dans SQL Server (ai-je tort ?).

1voto

RAS Points 3052

Je pense que la colonne du drapeau IsLast est suffisante, mais....

  1. La première question à laquelle vous devez répondre est la suivante : quel est le ratio d'Entités par rapport aux EntityVersions ? Cela peut influencer votre décision.

  2. De plus, je ne suis pas sûr de la structure de votre table, mais je suppose que la table EntityVersion est une copie de la table Entity qui stocke les données suivantes les champs modifiés (ou juste les différences, peut-être ?). Si c'est le cas, pourquoi ne pas stocker la dernière version dans l'entité elle-même. Je pense que c'est une approche plus sémantiquement correcte.

  3. Habituellement, si vous avez des indices corrects (essayez peut-être d'incorporer columnstoreIndex ?) vous ne devez pas effectuer de travaux spéciaux comme des déclencheurs qui peuvent être coûteux. Essayez de faire vos tests avec une jointure régulière avec GroupBy (ou vous n'avez même pas besoin d'une jointure si votre table EntityVersion a tous les champs nécessaires). Ou probablement cette approche sera un peu plus rapide : https://stackoverflow.com/a/438990/1792936

  4. Encore une fois, vous ne pouvez construire une requête optimale que sur la base de votre plan d'exécution et de tests de vitesse.

  5. Si tout le reste échoue, essayez peut-être d'incorporer Schéma CQRS ou quelque chose de similaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X