Your architecture should look something like this:

Data source &lt;--&gt; Data source driver &lt;--&gt; CRUD interface &lt;--&gt; Application


You'll need one data source driver implementation for each type of data source.  The CRUD interface will be the same regardless of data source.

Note that you can have more than just CRUD methods.  You might want to return collections, for example.  Just make sure that whatever you do on the Data Source side is translatable to your API on the CRUD side for all possible data sources.

Implementing a NoSQL and RDBMS compatible DAO
Let's say a player casts a spell, completely allows it to resolve, and accepts its consequences - then realises that was a bad idea, or there was something better to do. That player realises there was a better card to play, or that the spell will do something they don't want to happen, such as deal enough damage to that player to kill them.

Does the caster have the opportunity to go back and fix that mistake (and to stay alive), even though they already accepted the consequences?
