First as a bit of context, we have an aggregate which has a string attribute with an id. We need to convert the aggregate to hold a list of ids.
One consideration is that we have a couple hundred of these aggregates, but some have millions of events (the largest one has 8m events). We were wondering with my team about what options we have and we came up with these two.
- Delete the snapshots and re-create the current state, which will potentially pause the application until it completes.
- Do an ‘expand/contract’ cycle where we add the list and logic to handle both. This logic would null the original field (which should remove it from the snapshot). Also add a command handler that forces the creation of a new snapshot and fire the command on all aggregates. After this is done, remove the old field and command handler.
Do the approaches above sound reasonable? Is there a 3rd approach? I’m tempted to do the 2nd one, but some of my colleagues feel that replaying the whole history is the way to go.