128 votes

Utilisation d'un SGBDR comme stockage source d'événements

Si je devais utiliser un SGBDR (par exemple, SQL Server) pour stocker event sourcing des données, ce qui pourrait le schéma ressemble?

J'ai vu quelques variations parlé dans un sens abstrait, mais rien de concret.

Par exemple, dire qu'on a un "Produit" de l'entité, et les modifications de ce produit pourrait prendre la forme de: des Prix, des Coûts et de la Description. Je suis confus quant à savoir si j'avais:

  1. Avoir un "ProductEvent" table de, qui a tous les champs pour un produit, où chaque changement, un nouvel enregistrement dans la table, plus "qui, quoi, où, pourquoi, quand et comment" selon le cas. Lors de coûts, de prix ou de description sont modifiées, une toute nouvelle ligne comme ajoutés pour représenter le Produit.
  2. Magasin de contrôle des Coûts de produit, de Prix et de la Description dans des tables séparées rejoint à la table Produit avec une relation de clé étrangère. Lorsque les modifications apportées à ces propriétés se produire, écrire de nouvelles lignes avec WWWWWH tant que de besoin.
  3. Magasin WWWWWH, plus un objet sérialisé représentant de l'événement, dans un "ProductEvent tableau" au sens de l'événement lui-même doit être chargé, de-sérialisés et re-joué dans mon code d'application, afin de reconstruire l'état de l'application pour un Produit donné.

En particulier, je vous inquiéter au sujet de l'option 2 ci-dessus. Poussée à l'extrême, le produit table près de la table par la propriété, où à la charge de l'État de l'Application pour un produit donné nécessiterait le chargement de tous les événements pour que le produit de chacune de table d'événement. Cette table-explosion sent mauvais pour moi.

Je suis sûr que "ça dépend", et alors il n'y a pas une seule "bonne réponse", je vais essayer d'obtenir un sentir pour ce qui est acceptable et ce qui est totalement inacceptable. Je suis également conscient que le NoSQL peut aider à ici, où les événements pouvaient être stockées à l'encontre d'une racine d'agrégat, de sens qu'une seule requête à la base de données pour obtenir les événements de reconstruire l'objet à partir de, mais nous ne sommes pas à l'aide d'un NoSQL db pour le moment je me sens autour de solutions de rechange.

Merci beaucoup à l'avance.

118voto

Dennis Traub Points 24186

L'événement magasin ne devrait pas avoir besoin de savoir sur les champs ou propriétés des événements. Sinon, à chaque modification de votre modèle aurait pour résultat d'avoir à migrer votre base de données (comme dans une bonne vieille basées sur l'état de la persistance). Donc je ne recommande pas l'option 1 et 2 à tous.

Ci-dessous le schéma utilisé dans Ncqrs. Comme vous pouvez le voir, la table "Événements" stocke les données liées à un CLOB (c'est à dire JSON ou XML). Cela correspond à votre option 3 (qu'il n'y a pas de "ProductEvents" table parce que vous avez seulement besoin d'un générique "Événements" de la table. Dans Ncqrs la cartographie de votre regroupement des Racines passe par la "EventSources" table, où chaque EventSource correspond à une réelle Globale de la Racine.)

Table Events:
    Id [uniqueidentifier] NOT NULL,
    TimeStamp [datetime] NOT NULL,

    Name [varchar](max) NOT NULL,
    Version [varchar](max) NOT NULL,

    EventSourceId [uniqueidentifier] NOT NULL,
    Sequence [bigint], 

    Data [nvarchar](max) NOT NULL

Table EventSources:
    Id [uniqueidentifier] NOT NULL, 
    Type [nvarchar](255) NOT NULL, 
    Version [int] NOT NULL

Le SQL mécanisme de persistance de Jonathan Oliver Événement Magasin de la mise en œuvre se compose essentiellement d'une table appelée "s'Engage" avec un champ BLOB "Charge utile". C'est à peu près le même que dans Ncqrs, seulement qu'il sérialise les propriétés de l'événement dans un format binaire (qui, par exemple, ajoute la prise en charge du cryptage).

Greg Young recommande une approche similaire, en tant que largement documenté sur son site web.

Le schéma de son prototype "Événements" tableau se lit comme suit:

Table Events
    AggregateId [Guid],
    Data [Blob],
    SequenceNumber [Long],
    Version [Int]

3voto

kisai Points 33

Eh bien, vous pourriez envie de donner un coup d'oeil à Datomic.

Datomic est une base de données flexible, en fonction du temps de faits, de soutien et de requêtes de jointures, avec élastique de l'évolutivité et de l'ACIDE transactions.

J'ai écrit une réponse détaillée ici

Vous pouvez regarder une conférence de Stuart Halloway l'explication de la conception de Datomic ici

Depuis Datomic magasins faits dans le temps, vous pouvez l'utiliser pour l'event sourcing des cas d'utilisation, et bien plus encore.

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