Domanda

Stiamo lavorando a un progetto PHP, che è stato in sviluppo per oltre 2 anni, e ora il team è pronto e sente la volontà di passare allo sviluppo di un ORM. Perché accelera davvero lo sviluppo e ti consente di operare con gli oggetti e di non pensare in termini di codice SQL e tabelle del database per la maggior parte del tempo.

Abbiamo deciso di scegliere Doctrine ORM, perché ha YAML caricamento di dispositivi di dati - ne abbiamo davvero bisogno per i nostri test unitari.

Il timore principale che ho è che l'uso di un nuovo framework ORM possa rallentare le prestazioni del sito. Non è possibile stabilire una connessione condivisa tra il livello di astrazione del database corrente (che utilizza la sintassi pg_connect , non DOP compatibile). Il meccanismo di connessione al database non può essere commutato su PDO compatibile, poiché esistono molti codici SQL incompatibili con la sintassi PDO_SQLITE.

Quindi, a quanto ho capito, se inizieremo ad usarlo, raddoppierà il numero di connessioni al database. Non sono sicuro che il server database sarà in grado di gestirlo.

Cosa ci consiglieresti di fare in questa circostanza?

È stato utile?

Soluzione

Di quale rilevanza è PDO_SQLITE?

A meno che non si pianifichi effettivamente di utilizzare il driver SQLite, la compatibilità non è obbligatoria per PDO.

Se non utilizzerai SQLite, renderei il livello di database legacy DOP compatibile e riutilizzerei le connessioni fino a quando non potrai migrare completamente su Doctrine.

Detto questo, il livello delle connessioni non sarà la tua unica preoccupazione in termini di prestazioni passare a un ORM. Sono intrinsecamente inefficienti, quindi mi aspetto query più lente, maggiore utilizzo della larghezza di banda tra i server delle applicazioni e i server di database e un maggiore utilizzo della memoria a livello di applicazione a causa della selezione inevitabile di dati ridondanti. A seconda della configurazione corrente, quanto sopra potrebbe non essere un problema.

Probabilmente dovresti prendere l'ultimo paragrafo con un pizzico di sale, perché sono solo tratti degli ORM in generale e non della Dottrina in particolare, con la quale non ho avuto esperienza.

Altri suggerimenti

La cosa ovvia che puoi fare non è aprire una connessione al database finché non ne hai bisogno. Personalmente uso il codice in questo modo:

public function connect() {
  if (!defined('CONNECT')) {
    mysql_connect(...);
  }
}

public function db_query($query) {
  connect();
  $ret = mysql_query($query);
  if (!$ret) {
    die(mysql_error());
    error_log(mysql_error() . ' - ' . $query);
  }
  return $ret;
}

per ridurre la quantità di ripetitivi e per aprire una connessione solo quando ne hai bisogno.

Nel tuo caso devi quindi rompere il pezzo più piccolo che puoi iniziare. Idealmente dovrebbe essere una sezione verticale , il che significa che questa sezione farà funzionare quasi tutto il suo database con il nuovo codice e pochissimo con il vecchio. In questo modo puoi minimizzare il raddoppio delle connessioni al database e questo ti consente di acquisire alcune competenze e anche un'esperienza.

Attenzione, ORM non è affatto una panacea. Potresti odiare SQL e trovarlo complicato e soggetto a errori ma, per la maggior parte, stai semplicemente scambiando una serie di problemi con un altro. Personalmente penso che, sebbene l'ORM possa essere utile, è stato sovrascritto ed è più una falsa economia di quanto molti credano o siano disposti ad ammettere. Ho scritto di più su questo in Usando un ORM o un semplice SQL?

Non sto dicendo che non dovresti farlo. Non pensare che risolverà tutti i tuoi problemi. Inoltre, dal momento che questa riscrittura non cambierà affatto la funzionalità (da quello che hai descritto) non sono sicuro che il costo di farlo si confronti favorevolmente con la correzione di ciò che già esiste. Troppe incognite per dire in che modo andrà la tua situazione.

Bene, sì e no - le tue connessioni DB saranno raddoppiate solo se hai una connessione non DOP e DOP.

Non sono sicuro di cosa intendi con il riferimento PDO_SQLITE, dal momento che SQLite è un database completamente diverso rispetto a PostgreSQL, sembra che tu stia usando ora.

Dovresti essere in grado di eseguire le tue query correnti tramite PDO :: query proprio come fai oggi a meno che tu non stia facendo qualcosa di molto sbagliato :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top