La mia prima risposta sarebbe di risparmiarti il problema e trovare un buon ORM di mappatura dei dati e concentrarti sui tuoi oggetti di business e sulla logica, e lasciare che l'ORM si preoccupi della persistenza. La parte "data mapper" è importante qui, perché ti permette di avere un livello di dominio completamente separato dalla persistenza. Quindi avrai solo classi semplici senza perdite di persistenza sotto forma di classe base, interfaccia o altro.
Ora, se vuoi ancora provare a crearne uno tuo, questo è come lo farei io:
Questo è strongmente basato su come funziona Doctrine2 ORM per PHP:
Il punto di ingresso per qualsiasi codice sta usando l'ORM è il tuo EntityManager, questo è quello che usi per recuperare e salvare i tuoi oggetti entità / dominio. Poi hai il tuo livello di mappatura dei dati, che dovrebbe essere in grado di essere iniettato con informazioni di mappatura (in xml o qualsiasi altra cosa), in modo che possa capire come connettere le tabelle alle classi e alle colonne e come gestire le relazioni.
Sotto tutto questo, hai il livello di accesso db actuall, che deve essere abbastanza flessibile da gestire diversi database. Quindi, quando chiedi un'entità dall'EM, passerà attraverso il livello del mappatore per trovare la tabella da usare, quindi il dbal per recuperare i dati e ancora attraverso il mapper per mappare i dati su un oggetto. Quando salvi un'entità, EM utilizza il livello di mappatura per scoprire la tabella / le colonne dall'oggetto / proprietà e invia i dati al db per salvarlo effettivamente.
Doctrine utilizza anche classi proxy generate automaticamente per i tuoi oggetti. Questi proxy sono iniettati con l'EM per consentire il caricamento delle relazioni.
Questa è una versione semplificata delle cose, e sono sicuro che qualcuno l'ha già fatto in qualunque lingua tu stia usando. Ad esempio Doctrine ha anche un ODM, per MongoDB (questo è ancora beta).
EDIT:
Noterai che non ho mai menzionato nulla come una classe base o un'interfaccia che useresti nei tuoi oggetti di dominio. Dovrebbero essere assolutamente stupidi quando si tratta di persistenza, e l'unica "perdita" dalla persistenza ai livelli del dominio avviene nelle classi proxy, che dovrebbero apparire esattamente come gli oggetti del dominio per l'applicazione che li sta usando. In questo modo il tuo codice di dominio rimane pulito e semplice.