Managing custom data in production

I was wondering how you handle changing metafield or metaobject definitions, for an app that’s already installed and in use. I’m seeking some inspiration from the dev community on how best to implement this.

Currently whenever the user installs the app, we run the mutations for creating all the required metaobjects. But what if we suddenly want to change the shape of those objects at a later point?

I’m thinking it could be solved by manually running a job for each store entry in our database whenever a “breaking” change gets deployed. But is there a better way?