Does the data model still match what the product does?
Open the tables your app writes to and read the column names. Then describe out loud what your product does today. If the two descriptions match, most of your problems are local and fixable. If you are storing the real structure of your product inside a JSON blob, a column named metadata, or a comma-separated string because the schema had nowhere else to put it, you are paying a tax on every feature you add.
- 0 — The tables describe the product accurately. Adding a field means adding a field.
- 1 — One or two tables are awkward and there are workarounds you can name.
- 2 — Several features are implemented against the grain of the schema, and you can point at the code that fights it.
- 3 — The main entity in your product does not exist as a table. It is assembled at runtime from pieces of other tables.