Структура хранилища событий CQRS
В настоящее время я пытаюсь понять, как построить внутреннюю структуру хранилища событий. Что я получил до сих пор:
- В хранилище событий есть две таблицы (коллекции,...), одна для агрегатов и одна для событий.
- Таблица агрегатов содержит следующие данные:
aggregateId
(вероятно, это GUID) и aggregateVersion
(который представляет собой целое число, которое просто представляет номер последнего события, повлиявшего на этот агрегат).
- Таблица событий содержит следующие данные:
eventId
(опять же GUID), aggregateId
(к которому относится событие), payload
и a version
(который является просто целым числом, которое описывает порядок событий).
Насколько это правильно?
Должны ли события упорядочиваться с использованием целого числа? Или они должны быть заказаны на основе временной метки? В чем преимущества каждого из них? Каковы недостатки?
Ответы
Ответ 1
Я бы посоветовал вам ознакомиться с Jonathan Oliver EventStore для справки.
В версии сохранения SQL есть только одна таблица. Вы можете легко жить без общей таблицы и хранить aggregateId в таблице событий. Последнюю версию можно получить с помощью запроса max().
Кроме того, я думаю, вы должны подумать над заголовками в таблице событий, потому что всегда есть интересные метаданные, которые вы не хотите хранить в самих событиях.
А также, я думаю, вы должны добавить столбец даты в таблицу событий.
Наконец, вы, вероятно, захотите иметь какой-то флаг, который указывает, было ли отправлено событие вниз или нет. Это дополнение позволяет вам писать в одном потоке или процессе и отправлять в другой.
Ааа и там, я как бы предложил структуру Jonathans EventStore.
Ответ 2
Посмотрите http://geteventstore.com/ - эта версия Грега Янга также имеет источник, доступный для вашего прочтения [с лицензией BSD 3-clause на GitHub].
Ответ 3
Я не могу много добавить к ответу Микаэля.
Вот еще одна вещь в качестве ссылки: Несколько лет назад Грег Янг описал свои мысли о реализации магазина событий. Документ можно найти на http://cqrs.wordpress.com/documents/building-event-storage/
Хотя я считаю, что его подход развился и в то же время.
Ответ 4
Агрегаты связаны с cqrs, но не напрямую с хранилищем событий.
Вы правы, есть две коллекции, но это события и моментальные снимки.
Для более подробной информации смотрите:
https://github.com/jamuhl/nodeEventStore