When a data schema is the foundation of a system, it's often the most difficult thing to change.
I think this is a common mistake. People think their code is what’s important. But it’s the data and how it gets transformed that is the core of most applications.
Example is storing customers address and purchase history in same place, only because they "belong to customer" in a data sense. This is very bad because it leads to entangled architecture where everything depends on everything and you cannot extract truly independent modules. The project implemented like this simply cannot scale beyond a certain size.
So no, data is not important but how it is used.
So - I certainly agree 100% with what you say about keeping thing independent. Maybe I’m just unfamiliar with the terms.
On reflection, I'd also add that I do design systems "data first" however to me this doesn't mean "database first". It's important to think about how data flows through the system, how it gets transformed, and what parts of the system "own" which data.
All of this requires understanding of the boundaries of the various systems that make up the whole, which I think is exactly your point.
*or whatever external system.
If you had to make a guess at how many different pieces of information you have about you in databases for services worldwide (and how many of those are inaccurate, or unnecessary to provide the service), that number would be fairly ridiculous for most people (OOM thousands or tens of thousands).
Taking the address idea - no e-commerce site really needs to store this as a profile item. It needs to be in my browser so I can autocomplete for any shipping form.
The second point I’m making is the same as your last. “How it gets transformed” is often more important to start with than how it is at rest.
Ultimately where I’m coming from is that the flow of data through a system and how it is transformed is actually what’s important. For me that’s taking a “data first” approach, to use your term, but I took the term to mean something different to what you meant.
You are totally right about things like customer info. If you have an email component then that’s where email addresses live. If you have a fulfilment component then that’s where physical addresses live. 100% agree that they don’t belong together, at least not by default.
In fact, I tend to think of entities like customers as just a uuid. The bits and pieces we attach to that uuid depend on the system. But many domain objects should be treated in a very abstract way.
I’m not sure this is widely accepted, but it’s where I got to.
I don’t think there is any particular problem, or solution. Applications get old, assumptions change, the world moves in.
It’s true that our database design became inflexible over time and needed to be hoisted. But so too did our authentication layer (hand built - JaaS - JWT), the UI (AWT - Swing - Web 1.0 - Web 2.0), the deployment model (on prem - cloud - docker), even the API scheme (RMI - soap - rest - graphql).
Any application that lives long enough is going to go through this sort of change. The only constant in all of the above was SQL.
In my experience (I am retired from a telecom operator) using a database made applications quite inflexible yet real life implies constant changes in their data model and as a result when there was a "database migration" there was always some information lost.
On contrary Pick databases (MultiValue databases) were very useful.
https://en.wikipedia.org/wiki/Pick_operating_system