Se stavo utilizzando un RDBMS (ad esempio SQL Server) per memorizzare i dati di origine degli eventi, come potrebbe apparire lo schema?
Ho visto alcune variazioni di cui si parla in senso astratto, ma niente di concreto.
Ad esempio, supponiamo che uno abbia un'entità "Prodotto" e le modifiche a quel prodotto potrebbero avere la forma di: Prezzo, Costo e Descrizione. Sono confuso sul fatto che io:
- Avere una tabella "ProductEvent", che ha tutti i campi per un prodotto, dove ogni modifica significa un nuovo record in quella tabella, più "chi, cosa, dove, perché, quando e come" (WWWWWH) come appropriato. Quando il costo, il prezzo o la descrizione vengono modificati, viene aggiunta una riga completamente nuova per rappresentare il prodotto.
- Memorizza costo, prezzo e descrizione del prodotto in tabelle separate unite alla tabella Prodotto con una relazione di chiave esterna. Quando si verificano modifiche a queste proprietà, scrivere nuove righe con WWWWWH come appropriato.
- Memorizza WWWWWH, più un oggetto serializzato che rappresenta l'evento, in una tabella "ProductEvent", il che significa che l'evento stesso deve essere caricato, de-serializzato e riprodotto nuovamente nel codice dell'applicazione per ricostruire lo stato dell'applicazione per un determinato prodotto .
In particolare mi preoccupo dell'opzione 2 sopra. Portata all'estremo, la tabella del prodotto sarebbe quasi una tabella per proprietà, dove caricare lo stato dell'applicazione per un determinato prodotto richiederebbe il caricamento di tutti gli eventi per quel prodotto da ciascuna tabella degli eventi del prodotto. Questa esplosione da tavolo mi ha un cattivo odore.
Sono sicuro che "dipende", e sebbene non ci sia una singola "risposta corretta", sto cercando di avere un'idea di ciò che è accettabile e di ciò che è totalmente non accettabile. Sono anche consapevole del fatto che NoSQL può aiutare qui, dove gli eventi possono essere archiviati su una radice aggregata, il che significa solo una singola richiesta al database per ottenere gli eventi da cui ricostruire l'oggetto, ma non stiamo usando un database NoSQL al momento così sto cercando alternative.