Versioning Mysql Data (Not Just Schema)
Database (especially their data) are rarely stored in a version control system because it doesn't scale well for large databases.
In your case, if you have not too much data, that could work, especially since a mysqldump
can produce a delimited text format (which has a chance to diff against the previous version)
I would still recommend a separate git repo and a dedicated tool to manage both schema and data changes. For instance, LiquidBase can provide "source control for your database".
You also have, as a dedicated specialized database: off-scale.
If you were to do this manually, then you have good practices summarized in "Recipes for Continuous Database Integration".
As mentioned here, even for schema:
I learned the hard way that applying database schema changes cannot be reliably done without a comprehensive step-by-step plan and, similarly, the order of relationship dependencies are important.
Just storing the "current" or "end" schema is not sufficient. There are many changes that cannot be retroactively appliedA->C
without knowingA->B->C
and some changesB
might involve migration logic or corrections.
Is your requirements as simply as following:
- Same back-end code;
- Use master data in live;
- End-users (or group) to work on isolated data;
- No migration, end-users can only modify the data (DML), and are not allowed to modify the schema (DDL);
If these are the requirements, then you can use multiple databases. Consider the following databases in a MySQL server:
- masterdb
- branch_demo
- branch_brian
- branch_sandbox
- ...
These databases share the exact same schema, and only the data is different. In each branch, we have a special table (i.e. dbinfo), to keep track of the parent branch (probably masterdb), create datetime, and other details, like access-level, etc.
- id
- branchname
- parent_branch
- created_on
- lastmod_on
You can allow end-users to work on separate branches, by simply allowing them to select a particular database in the UI, where masterdb is selected as default, and is used in LIVE.
- Creating a new branch, would be as simple as cloning a database;
- Merging a newer branch to master, could be handled using the REPLACE statement in MySQL;
If you want to keep track of changes in the data, you can create a special table to log the activities.