Progettazione di una classe di driver di database universale

5

Ho un framework MVC homebrew che uso da un po 'e ha funzionato benissimo, ma sto programmando un upgrade ad esso per le sue classi ORM. Finora supporta solo i database SQL creando istruzioni dipendenti da quale funzione viene chiamata. La classe ORM include la struttura del campo e la convalida, i campi calcolati, gli indici e le classi unite (per associazioni, 1-1 , 1-* , *-1 e *-* ) e fornisce funzionalità sufficienti per selezionare qualsiasi dato e recuperare le righe associate nel database.

Ma vorrei estenderlo per supportare database XML, LDAP e NoSQL (ad esempio MongoDB). Le mie idee per implementare questo sarebbe modificare le funzioni all'interno della classe ORM per interagire con un driver personalizzato (per ogni tipo di database) in un formato comune. Sfortunatamente, non ho avuto abbastanza esperienza nell'usare questi altri formati abbastanza per progettare adeguatamente una classe di interfaccia che potrebbe essere utilizzata dall'ORM per qualsiasi tipo.

Quindi, ci sono driver di database universali che supportano tutti questi tipi di database, quindi posso imparare dall'esempio?

L'interfaccia corrente su cui sto lavorando è:

interface DBDriver {
  function connect($host, $un, $pw, $persist = false);
  function disconnect();
  function selectDB($db);
  function charset($charset);
  function insert($table, $values);
  function select($table, $fields, $joins, $where, $group, $having, $order, $limit);
  function update($table, $where, $values, $where, $order, $limit);
  function delete($table, $where, $order, $limit);
  function transactionBegin();
  function transactionCommit();
  function transactionRollback();
}

Ma sono preoccupato che, sebbene questo fornisca abbastanza per la creazione di istruzioni SQL, potrebbe non essere sufficiente, o forse addirittura eccessivo per altri metodi come XML o NoSQL.

    
posta topherg 23.04.2013 - 16:48
fonte

1 risposta

4

Sarebbe così astratto che non farebbe nulla di utile (analisi paralisi / inattività astrazione). La cosa migliore da fare sarebbe definire le interfacce per CRUD / BREAD / etc e implementarle quando sono necessarie. Se stai utilizzando PHP 5.4, puoi trarre vantaggio dai tratti in modo da poter preparare i driver in modo frammentario per un comportamento condiviso.

interface Create { }
interface Read { }
interface Update { }
interface Delete { }
interface Browse { }
interface Edit { }
interface Add { }
interface CRUD extends Create, Read, Update, Delete { }
interface BREAD extends Browse, Read, Edit, Add, Delete { }
interface Transactional { }
    
risposta data 22.05.2013 - 00:27
fonte

Leggi altre domande sui tag