There are also ways to add some flexibility into a "fixed" schema when you need it. Entity-attribute-value tables, views, JSON columns (as a last resort), or a semantic layer like https://github.com/totalhack/zillion
This is the design-time escape hatch for me. The remaining 20% space of unknowns can usually be dealt with here. As long as the most critical tables, relations & properties have been set in stone, I would find it reasonable to allow a "ExtendedPropertiesJson" column in limited areas of the schema.
Over time, these JSON blobs should be refactored into the schema as features become more stable.
The key is to have a solid relational model as the foundation. You cannot really do it the other way around.
This is the design-time escape hatch for me. The remaining 20% space of unknowns can usually be dealt with here. As long as the most critical tables, relations & properties have been set in stone, I would find it reasonable to allow a "ExtendedPropertiesJson" column in limited areas of the schema.
Over time, these JSON blobs should be refactored into the schema as features become more stable.
The key is to have a solid relational model as the foundation. You cannot really do it the other way around.