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 paradigma dell'incompatibilità oggetto/relazione (ingl. object/relational paradigm mismatch). Il modo più semplice di risolvere questo problema sarebbe la sostituzione dei database relazionali con i database ad oggetti. Accedere a questa nuova generazione, nonè tuttavia un compito facile, perché alla popolarità dei database relazionali concorrono le enormi quantità dei dati in loro raccolti negli anni. Perché allora la mappatura oggettuale-relazionale è una sfida così importante? La creazione di strumenti che l'assicurino richiede la soluzione di diverse problematiche legate alle trascrizioni e alla raccolta degli oggetti. Per primo quindi, dobbiamo impostare in che modo, saranno mappate le classi alla tabella nel DB, e la composizione di queste nei campi della tabella. Negli oggetti possono presentarsi composizioni, che non sono semplici dati e non possono essere trascritte direttamente dai campi nella tabella (ad es. riferimenti ad altri oggetti oppure tipi di disposizioni). Il problema successivo è costituito dal diverso modo di identificazione degli oggetti (chiavi primarie e referenze) e dai collegamenti tra gli oggetti (chiavi estranee e referenze). Si deve anche fare menzione che, generalmente nella programmazione ad oggetti, l'idea dei settori non ha un corrispettivo nel mondo dei database relazionali.

Completamente un altro tipo di problematiche è costituito dall'effettiva raccolta dati. In SQL possiamo definire in modo molto preciso, quali campi della tabella si trovano nei risultati delle query. Accedendo con l'utilizzo di ORM , abbiamo meno controllo sulla quantità e sul modo di raccolta dei dati: dobbiamo specificare le query in altri linguaggi, diversi da SQL ed in effetti ottenere oggetti correttamente costruiti (spesso determinail ritorno di tutti i campi della tabella, anche se in un dato momento abbiamo bisogno di solo uno di essi). Per il linguaggio Java esistono da tempo implementazioni avanzatissime dell'idea ORM.

Un esempio positivo standard è costituito dal progetto opensource Hibernate. Propel ha le sue radici in altri progetti Java, Torque.

Basate su Propel (e Torque) le soluzioni architetturali determinano che abbiamoa che fare con implementazioni semplificate di ORM. In particolare, ogni classe è mappata direttamente da una tabella unica nel DB. Questo punta purtroppo sull'azione al servizio di una relazione di tipo molti-molti, per la quale si deve definire la tabella intermedia e scrivere un codice aggiuntivo

 

Propel in azione

La maggior parte del tempo necessario per poter utilizzare le conoscenze acquisite va speso nella pratica. In diversi passi successivi apriremo un'applicazione pienamente funzionante che utilizza i vantaggi di Propel. Guardiamo primail Listing 3. Vi è rappresentato il file XML con la 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>

 

<<< Precedente  -  Continua >>>

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?