Если бы я использовал RDBMS (например, SQL Server) для хранения данных источника данных, как могла бы выглядеть схема?
Я видел несколько вариаций, которые обсуждались в абстрактном смысле, но ничего конкретного.
Например, предположим, что у вас есть объект "Продукт", и изменения в этом продукте могут быть представлены в виде: Цена, Стоимость и Описание. Я смущен тем, что:
- У вас есть таблица "ProductEvent", в которой есть все поля для продукта, где каждое изменение означает новую запись в этой таблице, а также "кто, что, где, почему, когда и как" по мере необходимости. Когда изменяется стоимость, цена или описание, добавляется вся новая строка для представления Продукта.
- Сохранять стоимость продукта, цену и описание в отдельных таблицах, соединенных с таблицей продуктов с отношением внешнего ключа. Когда происходят изменения этих свойств, напишите новые строки с WWWWWH, если это необходимо.
- Храните WWWWWH, а также сериализованный объект, представляющий событие, в таблице "ProductEvent", то есть само событие должно быть загружено, де-сериализовано и повторно воспроизведено в моем коде приложения, чтобы перестроить состояние приложения для данный продукт.
В частности, я беспокоюсь о варианте 2 выше. Доведенный до крайности, таблица продуктов была бы почти одной таблицей на каждое свойство, где для загрузки состояния приложения для данного продукта потребовалась бы загрузка всех событий для этого продукта из каждой таблицы событий продукта. Этот стол-взрыв плохо пахнет мне.
Я уверен, что "это зависит", и пока нет единого "правильного ответа", я пытаюсь понять, что приемлемо, и что совершенно неприемлемо. Я также знаю, что NoSQL может помочь здесь, где события могут быть сохранены против совокупного корня, что означает только один запрос к базе данных, чтобы получить события, чтобы перестроить объект, но мы не используем базу данных NoSQL на момент, поэтому я чувствую вокруг альтернатив.