Событие Sourcing. Агрегирует со списками детей или с ParentID? - PullRequest
0 голосов
/ 27 октября 2019

Стоит ли хранить в совокупных списках детей или только в ParentID?

Списки детей могут быть огромными (тысячи). Добавление или удаление одного дочернего элемента будет означать сохранение обратно в хранилище тысяч и тысяч дочерних элементов при добавлении или удалении только одного. ParentID очень прост в управлении. Это делает все агрегаты простыми (без списков!). Это позволяет быстро создавать списки, просто запрашивая агрегаты по их ParentID. Он допускает произвольный уровень иерархий, который можно быстро рекурсивно перестроить без создания огромных агрегатов. Если бы я пошел с ParentID, должен ли я добавить в таблицу событий поле ParentIdGuid для ссылки на родителя агрегата, чтобы я мог быстро создавать списки?

РЕДАКТИРОВАТЬ:

Ответ Брэда заставил меняПоймите, что parentid не будет включен в результирующий json дочерних объектов, которые были обновлены, так как я бы включил только те поля, которые были изменены. Поэтому я не могу полагаться на индексирование JSON Postgress. Это означает, что мне нужно создать столбец парентиды в самой таблице событий.

1 Ответ

1 голос
/ 28 октября 2019

Идентификатор родителя на ребенке, безусловно, путь. Подумайте о внешнем ключе базы данных. Отношение сохраняется как указатель родительского идентификатора в дочерней записи.

Когда вы создаете экземпляр AR в памяти, чтобы использовать его, вы должны заполнить список детей, используя указатель ParentID. Если это дорого, как это звучит, возможно, вы внедрили функцию заполнения по требованию, чтобы не платить цену, если в этом нет необходимости.

Существует два подхода к таблице событий. Он либо содержит все свойства объекта после внесения изменения, либо может содержать только измененные поля. Если вы хотите сохранить все свойства, то ParentID должен быть в каждом событии. Если вы предпочитаете сохранять только изменения, то где-то в списке событий для этого объекта должен быть ParentID;возможно только в событии создания. С помощью Event Sourcing вы суммируете все события изменения, чтобы получить текущее состояние, так что это даст вам ParentID в сущности.

...