PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Relationales Datenbankschema für Event Sourcing

Ich denke, es ist flexibler, wenn Sie den Promoter als Teil der Ereignisnutzlast anstelle von Metadaten speichern. Die Sicherheitsbedenken sollten außerhalb der Domäne gehandhabt werden. Nicht jedes Ereignis wird von einem Benutzer ausgelöst, obwohl Sie für ihn ein falsches Ereignis erstellen könnten (ein SysAdmin für CronJob).

Zum Beispiel:

ManualPaymentMadeEvent { //store this object as details in your schema
    amount,
    by_user//In this case, developers can determine whether store the promoter case by case
}

Ich denke, Klassennamen sind genug. Das Hinzufügen einer weiteren Tabelle erschwert das Lesen von Ereignissen (durch Join-Tabellen), und ich denke, es fügt nur dann einen Wert hinzu, wenn die Klassennamen umbenannt werden (eine Zeile in der Ereignistyptabelle aktualisieren). Aber ich denke, es macht nicht viel Ärger durch die Verwendung von

update domain_events set 
    aggregate_type = 'new class name'
where aggregate_type = 'origin class name'

Ich bin mir nicht sicher, ob ich Ereignisgruppen verstehe, könnten Sie weitere Erläuterungen hinzufügen?

Manchmal werden die Ereignisse verwendet, um mehrere Kontexte zu integrieren. Aber jedes Ereignis wird nur in einem Kontext ausgelöst. Beispielsweise wird ein ManualPaymentMadeEvent im Bestellkontext ausgelöst, und ein Ereignislistener im Versandkontext konsumiert es ebenfalls und betrachtet es als Auslöser für den Beginn des Versands.

Ich ziehe es vor, pro Datenbankbenutzer (Oracle-Begriff) pro Kontext zu verwenden. shipping.domain_events für den Versandkontext und ordering.domain_events für den Bestellkontext.

Hier ist das Schema in axon-framework was helfen könnte

create table DomainEventEntry (
    aggregateIdentifier varchar2(255) not null,
    sequenceNumber number(19,0) not null,
    type varchar2(255) not null,  --aggregate class name
    eventIdentifier varchar2(255) not null,
    metaData blob,   
    payload blob not null, -- details
    payloadRevision varchar2(255),
    payloadType varchar2(255) not null, --event class name
    timeStamp varchar2(255) not null
);

alter table DomainEventEntry
    add constraint PK_DomainEventEntry primary key (aggregateIdentifier, sequenceNumber, type);