PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Schema di database relazionale per l'origine eventi

Penso che sia più flessibile se memorizzi il promotore come parte del payload dell'evento anziché come metadati. I problemi di sicurezza devono essere gestiti al di fuori del dominio. Non tutti gli eventi vengono generati da un utente, anche se potresti crearne uno falso (un SysAdmin per CronJob).

Ad esempio:

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
}

Penso che i nomi delle classi siano sufficienti. L'aggiunta di un'altra tabella complica la lettura dell'evento (per unire le tabelle) e penso che aggiunga valore solo quando i nomi delle classi vengono rinominati (Aggiorna una riga nella tabella del tipo di evento). Ma penso che non aggiunga molti problemi usando

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

Non sono sicuro di aver capito i gruppi di eventi, potresti aggiungere ulteriori spiegazioni?

A volte gli eventi vengono utilizzati per integrare più contesti. Ma ogni evento è sollevato solo in un contesto. Ad esempio, A ManualPaymentMadeEvent viene generato nel contesto dell'ordine e anche un listner di eventi nel contesto della spedizione lo consuma, lo considera il trigger per l'avvio della spedizione.

Preferisco utilizzare per utente del database (termine Oracle) per contesto. shipping.domain_events per il contesto di spedizione e ordering.domain_events per il contesto di ordinazione.

Ecco lo schema in axon-framework che potrebbe aiutare

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);