Gestire database in PHP 5 (Parte III)
Pagina 3 di 8
ORM e Propel
La già citata incompatibilità tra i mondi:oggettuale e relazionale è definito come il paradigmadell'incompatibilità oggetto/relazione (ingl.object/relational paradigm mismatch). Il modopiù semplice di risolvere questo problema sarebbe lasostituzione dei database relazionali con i database adoggetti. Accedere a questa nuova generazione, nonètuttavia un compito facile, perché allapopolarità dei database relazionali concorrono leenormi quantità dei dati in loro raccolti negli anni.Perché allora la mappatura oggettuale-relazionaleè una sfida così importante? La creazione distrumenti che l'assicurino richiede la soluzione didiverse problematiche legate alle trascrizioni e allaraccolta degli oggetti. Per primo quindi, dobbiamo impostarein che modo, saranno mappate le classi alla tabella nel DB, ela composizione di queste nei campi della tabella. Neglioggetti possono presentarsi composizioni, che non sonosemplici dati e non possono essere trascritte direttamentedai campi nella tabella (ad es. riferimenti ad altri oggettioppure tipi di disposizioni). Il problema successivo ècostituito dal diverso modo di identificazione degli oggetti(chiavi primarie e referenze) e dai collegamenti tra glioggetti (chiavi estranee e referenze). Si deve anche faremenzione che, generalmente nella programmazione ad oggetti,l'idea dei settori non ha un corrispettivo nel mondo deidatabase relazionali.
Completamente un altro tipo di problematiche ècostituito dall'effettiva raccolta dati. In SQL possiamodefinire in modo molto preciso, quali campi della tabella sitrovano nei risultati delle query. Accedendo conl'utilizzo di ORM , abbiamo meno controllo sullaquantità e sul modo di raccolta dei dati: dobbiamospecificare le query in altri linguaggi, diversi da SQL ed ineffetti ottenere oggetti correttamente costruiti (spessodeterminail ritorno di tutti i campi della tabella, anche sein un dato momento abbiamo bisogno di solo uno di essi). Peril linguaggio Java esistono da tempo implementazioniavanzatissime dell'idea ORM.
Un esempio positivo standard è costituito dal progettoopensource Hibernate. Propel ha le sue radici in altriprogetti Java, Torque.
Basate su Propel (e Torque) le soluzioni architetturalideterminano che abbiamoa che fare con implementazionisemplificate di ORM. In particolare, ogni classe èmappata direttamente da una tabella unica nel DB. Questopunta purtroppo sull'azione al servizio di una relazionedi tipo molti-molti, per la quale si deve definire la tabellaintermedia e scrivere un codice aggiuntivo
Propel in azione
La maggior parte del tempo necessario per poter utilizzare leconoscenze acquisite va speso nella pratica. In diversi passisuccessivi apriremo un'applicazione pienamentefunzionante che utilizza i vantaggi di Propel. Guardiamoprimail Listing 3. Vi è rappresentato il file XML conla descrizione del già citato database (Fig. 1).
Listing 3. Schema di database scritto in XML
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE database SYSTEM "../dtd/database.dtd"><database name="bookstore" defaultIdMethod="native"><table name="book" description="Book Table"><column name="book_id" required="true" primaryKey="true"autoIncrement="true" type="INTEGER" description="Book Id"/><column name="title" required="true" type="VARCHAR" size="255"description="Book Title"/><column name="isbn" required="true" type="VARCHAR" size="24"phpName="ISBN" description="ISBN Number"/><column name="publisher_id" required="true" type="INTEGER"description="Foreign Key Publisher"/><column name="author_id" required="true" type="INTEGER" description="Foreign Key Author"/><foreign-key foreignTable="publisher"><reference local="publisher_id" foreign="publisher_id"/></foreign-key><foreign-key foreignTable="author"><reference local="author_id" foreign="author_id"/></foreign-key></table><table name="publisher" description="Publisher Table"><column name="publisher_id" required="true" primaryKey="true"autoIncrement="true" type="INTEGER" description="Publisher Id"/><column name="name" required="true" type="VARCHAR" size="128"description="Publisher Name"/></table><table name="author" description="Author Table"><column name="author_id" required="true" primaryKey="true"autoIncrement="true" type="INTEGER" description="Author Id"/><column name="first_name" required="true" type="VARCHAR" size="128"description="First Name"/><column name="last_name" required="true" type="VARCHAR" size="128"description="Last Name"/></table><table name="review" description="Book Review"><column name="review_id" required="true" primaryKey="true"autoIncrement="true" type="INTEGER" description="Author Id"/><column name="reviewed_by" required="true" type="VARCHAR" size="128"description="Reviewer Name"/><column name="review_date" required="true" type="DATE" description="Date of Review"/><column name="recommended" required="true" type="BOOLEAN"description="Does reviewer recommend the book?"/><column name="book_id" required="true" type="INTEGER" description="Book ID for this review"/><foreign-key foreignTable="book" onDelete="CASCADE"><reference local="book_id" foreign="book_id"/></foreign-key></table></database>
- Articolo precedente Gestione dei database in PHP5 (Parte II)
- Articolo successivo Database in PHP5 con Propel (Parte V)