Se eu estivesse usando um RDBMS (por exemplo, SQL Server) para armazenar dados de origem de eventos, como seria o esquema?
Eu vi algumas variações faladas em um sentido abstrato, mas nada de concreto.
Por exemplo, digamos que alguém tenha uma entidade "Produto" e as alterações nesse produto possam vir na forma de: Preço, Custo e Descrição. Estou confuso sobre se eu:
- Tenha uma tabela "ProductEvent", que contém todos os campos de um produto, onde cada alteração significa um novo registro nessa tabela, mais "quem, o quê, onde, por que, quando e como" (WWWWWH) conforme apropriado. Quando o custo, preço ou descrição são alterados, uma nova linha inteira é adicionada para representar o Produto.
- Armazene Custo, Preço e Descrição do produto em tabelas separadas unidas à tabela Produto com um relacionamento de chave estrangeira. Quando ocorrerem alterações nessas propriedades, escreva novas linhas com WWWWWH conforme apropriado.
- Armazene WWWWWH, mais um objeto serializado que representa o evento, em uma tabela "ProductEvent", o que significa que o próprio evento deve ser carregado, desserializado e reproduzido no código do meu aplicativo para reconstruir o estado do aplicativo para um determinado produto .
Particularmente, me preocupo com a opção 2 acima. Levada ao extremo, a tabela de produtos seria quase uma tabela por propriedade, onde carregar o Estado do aplicativo para um determinado produto exigiria o carregamento de todos os eventos desse produto de cada tabela de eventos do produto. Esta explosão de mesa me cheira mal.
Tenho certeza de que "depende" e, embora não haja uma única "resposta correta", estou tentando sentir o que é aceitável e o que é totalmente não aceitável. Também estou ciente de que o NoSQL pode ajudar aqui, onde os eventos podem ser armazenados em uma raiz agregada, o que significa apenas uma única solicitação ao banco de dados para obter os eventos para reconstruir o objeto, mas não estamos usando um banco de dados NoSQL no momento, então estou procurando alternativas.