Я ищу рефакторинг существующей базы кода, прежде чем мы выпустим ее в дикой природе с нашим первым клиентом, и мне действительно не нравится текущая структура хранения событий домена, и я пытался придумать хороший способ для хранения множества & очень разных событий в таблицах RDB.Хранилище событий домена в SQL ... используйте сериализацию JSON?
Архитектура:
- Веб-приложение
- Java
- Spring 4
- Spring JDBC
- MSSQL
Детали:
- 40 + - различные события, каждый из которых связан либо с общим корнем, либо с одним из его дочерних элементов.
- Подробная информация о событии сохраняются, но не состояние объекта (так что не CQRS событие источников)
- События используются только для отчетов
- отчеты подаются с объектами Java. IE. отчеты НЕ запускаются непосредственно из SQL.
В настоящее время события хранятся в одной таблице событий за ограниченный контекст. Для того, чтобы держать все различные типы событий & данные схемы таблицы выглядят следующим образом
event_id long,
event_type varchar,
event_time datetime,
context_1_key varchar,
context_1_val varchar,
context_2_key varchar,
context_2_val varchar,
context_3_key varchar,
... повторять как 10й ...
так, например (порядок = совокупный корень, п = ребенок)
event_type=ITEM_OPEN
context_1_key=ORDER_ID
context_1_value=1000
context_2_key=ITEM_ID
context_2_value=2000
Нет Мне это не нравится, и я не отвечал за это.
Вопросы:
- context_1_xxx поля являются хрупкими и трудно поддерживать/устранение неисправностей/развернуть
- Все чучела в одну таблицу будет проблемой производительности (даже если отчетность не производительность чувствительна)
- События связаны с объектом домена; они не сохраняют состояние объекта. например. записанное событие бесполезно, если элемент удален
Моя кишка говорит мне, что создание 40 разных таблиц со схемой, уникальной для каждого события, не является ответом. Вместо этого я думал о сериализации (JSON) моментального снимка объекта (ов) домена для сохранения вместе с данными события.
кажется удобным решением:
- мы уже используем/Jackson модуль Spring для сериализации объектов для клиентов на основе браузера.
- команда довольно удобна в процессе сериализации/десериализации, поэтому нет основной кривой обучения.
- данные события должны вернуться через приложение для создания отчетов, которые будут достаточно легко, десериализацией с Джексоном
Только реальные минусы я могу увидеть: - не в состоянии использовать SQL на базе 3-й партии инструменты отчетности - не удалось индексировать таблицы по свойствам сохраненного объекта (JSON)
Я могу несколько смягчить проблему №2 путем дальнейшего разбиения хранилища событий на несколько разных таблиц.
Что еще мне не хватает? Существует ли наилучший подход к достижению этого? Как ты делаешь это?
Спасибо за ввод, ссылки были весьма полезными. Просто уточнить ... Я говорил «моментальный снимок» объекта домена, как при записи состояния «порядка» в то время, когда этот «заказ» был выпущен. Я не рассматривал состояние объекта домена как часть события. Хотя теперь, когда я думаю об этом, я полагаю, что все, что не используется в предложении where поискового запроса, может быть сериализовано. – Stoney