2009-09-10 17 views
10

Sto armeggiando con CodeIgniter e ho incontrato Active Records per la prima volta. All'inizio l'ho liquidato come qualcosa per le persone che non sanno davvero come scrivere SQL. Mi rendo conto ora che la mia analisi era imperfetta e la Active Records è piuttosto prominente, specialmente in Rails.Qual è lo scopo dei record attivi?

Ma qual è lo scopo di Active Records? È di astrarre le diverse individualità RDBMS. Se è così ho pensato che non è ciò che SQL è destinato a fare. Inoltre, qual è la migliore pratica, dovrei usare questi?

Grazie in anticipo

risposta

5

Il "Registra modello attivo" sta diventando una parte fondamentale della maggior parte dei quadri di programmazione. Rende più semplici le attività CRUD (Crea, Aggiorna, Leggi, Elimina) più rapidamente. Ad esempio, piuttosto che dover scrivere molti SQL per inserire, aggiornare ed eliminare molti oggetti dati comuni e semplici, consente semplicemente di assegnare i valori all'oggetto dati ed eseguire un comando, ad es. $ object-> save(), l'SQL è compilato ed eseguito per te.

La maggior parte dei framework implementa anche relazioni di dati all'interno dei rispettivi modelli Active Record che possono semplificare notevolmente l'accesso ai dati relativi al proprio oggetto. Ad esempio, in CodeIgniter, se si specifica che una categoria "ha molti" prodotti, dopo aver caricato l'oggetto categoria dal database, è possibile elencare i prodotti figlio con una semplice riga di codice.

foreach ($category->products as $product) { 
    echo $product->name; 
} 

Un altro vantaggio di Active Record è, come dici tu, che rende il vostro codice facilmente portabile su diverse piattaforme di database (a condizione che il quadro che si sta utilizzando ha un driver per il database prescelto) e anche se questo non è probabile che sembri importante in questo momento, ne ho un maggiore valore in un secondo momento se la tua applicazione diventa popolare!

Speriamo che questo abbia aiutato. Wikipedia descrive bene l'Active Record (http://en.wikipedia.org/wiki/Active_record_pattern) e anche i documenti CodeIgniter. Personalmente, io uso KohanaPHP (http://www.kohanaphp.com) che è un fork5 solo PHP di CodeIgniter e trovo che i suoi modelli ORM siano molto utili!

8

attivo record è un modello di progettazione per l'accesso ai dati ...

Al momento ci sono due principali modelli di progettazione mi sembra di imbattersi in materia di accesso ai dati: ActiveRecord e Pattern Repository

attivo Record

Gli oggetti contengono metodi per la persistente loro stato ad un DB (o altro meccanismo di persistenza) così:

Si può avere un oggetto Cliente.

L'oggetto del cliente avrà un sacco di metodi come Customer.Save() ;, Customer.Get (int id); e altri.

Questi metodi in realtà non hanno nulla a che fare con un cliente nel mondo reale. Sono davvero sull'infrastruttura della tua applicazione.

Repository modello

In Pattern Repository, l'oggetto cliente sarebbe un POCO, o un oggetto muto. Ha solo metodi e proprietà che in realtà ha bisogno di rappresentare un cliente (cose come nome, indirizzo email, gli ordini List, ecc)

Quando si vuole persistere il cliente - è sufficiente passarlo al repository

Repository.Save (MyCustomer).

Il modello di record attivo è veloce e facile da utilizzare. Sfortunatamente, ingombra il tuo modello di dominio con questi metodi che in realtà non hanno nulla a che fare con un cliente. Ciò rende leggermente più difficile mantenere il tuo modello di dominio nel tempo.

Per molte situazioni è molto appropriato utilizzare uno schema di registrazione attivo. Ad esempio: se sto scrivendo un'app abbastanza semplice che probabilmente non cambierà molto, probabilmente accendere SubSonic e generare un DAL di un record attivo. Sarei codificato il mio codice aziendale entro 20 minuti e tutte le cose di DB sono già state prese in considerazione.

Se, d'altra parte, mi sto modellando un dominio particolarmente complessa, con elevata suscettibilità per cambiare, preferisco mantenere il mio modelli di dominio pulita, e attuare un modello di repository con NHibernate o simili ...

È passato molto tempo da quando ho eseguito il rollover del mio accesso ai dati tramite ADO.Net, e in realtà non lo consiglio vivamente ci sono così tanti ottimi strumenti di accesso ai dati disponibili.

+0

+1. Ottima spiegazione –

0

Active Record è un ORM: hai dato un'occhiata alla tecnica di mappatura degli oggetti? Penso che se capisci l'ORM, inizierai a vedere i benefici.

+0

Ci sono stati ORM che hanno "Active Record" nel nome, ma Active Record è più correttamente un modello di progettazione di applicazioni aziendali. Dai un'occhiata al libro di Martin Fowler nella mia risposta, è un ottimo libro per chiarire queste cose. – Ash

+0

Ciao Ash, grazie per questo - prenderà una lettura ... – JonB

2

Potrei dare la mia opinione su questo modello ma la migliore copertura di Active Record (e molti altri) è Patterns of Enterprise Application Architecture di Martin Fowler.

Da Capitolo 10:

attivo Record

Un oggetto che avvolge una riga in una tabella del database o vista, incapsula l'accesso al database, e aggiunge dominio logica su quei dati.

Un oggetto porta entrambi i dati e il comportamento di . Gran parte di questi dati è persistente e deve essere memorizzato in un database . Active Record utilizza il più ovvio approccio , mettendo la logica di accesso ai dati nell'oggetto dominio. In questo modo, tutte le persone sanno leggere e scrivere i loro dati da e verso il database.

...

quando usarlo

attivo Record è una buona scelta per logica di dominio che non è troppo complesse, come ad esempio crea, si legge, aggiornamenti ed eliminazioni. Derivazioni e convalide basate su un singolo record funzionano bene in questa struttura.

...

attivo Record ha il primario vantaggio della semplicità. È facile compilare Active Records e sono di facile comprensione. Il loro problema principale è che funzionano bene solo se gli oggetti Active Record corrispondono a direttamente alle tabelle del database: uno schema isomorfo .

Se la logica di business è complessa, presto desidera uso diretto relazioni del vostro oggetto, collezioni, eredità, e così via. Questi non sono mappa facilmente su Active Record, e aggiungendoli in modo frammentario diventa molto disordinato. Questo è quello che vi porterà a utilizzare i dati Mapper invece

1

Se possibile, facilita la scrittura delle query. Trovo che la sintassi normale di MySQL sia soggetta a errori di sintassi (nessun errore tranne il mio) e con la sintassi del record attivo CI ciò accade raramente a me.

Active Record è una delle funzionalità più interessanti di CI IMHO