Beispiel 12.1 zeigt die XML-Spezifikation eines Datenmodells für einen Buchkatalog, in dem zu jedem Buch neben Titel und ISBN auch Autor und Verlag gespeichert werden. Autoren und Verlage werden hierbei in separaten Tabellen gespeichert und über Fremdschlüssel mit der Buchtabelle verknüpft.
Beispiel 12.1: Spezifikation des Datenmodells in XML
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<database name="books" defaultIdMethod="native">
<table name="author" description="Autor-Tabelle">
<column name="author_id" required="true" primaryKey="true"
type="INTEGER" description="Autor-ID"/>
<column name="first_name" required="true"
type="VARCHAR" size="128" description="Autor Vorname"/>
<column name="last_name" required="true"
type="VARCHAR" size="128" description="Autor Nachname"/>
</table>
<table name="publisher" description="Verlag-Tabelle">
<column name="publisher_id" required="true" primaryKey="true"
type="INTEGER" description="Verlag-ID"/>
<column name="name" required="true"
type="VARCHAR" size="128" description="Verlag-Name"/>
</table>
<table name="book" description="Buch-Tabelle">
<column name="book_id" required="true" primaryKey="true"
type="INTEGER" description="Buch-ID"/>
<column name="title" required="true"
type="VARCHAR" size="255" description="Buch-Titel"/>
<column name="isbn" required="true"
type="VARCHAR" size="24" description="ISBN-Nummer"/>
<column name="author_id" required="true"
type="INTEGER" description="Fremdschlüssel Autor"/>
<column name="publisher_id" required="true"
type="INTEGER" description="Fremdschlüssel Verlag"/>
<foreign-key foreignTable="author">
<reference local="author_id" foreign="author_id"/>
</foreign-key>
<foreign-key foreignTable="publisher">
<reference local="publisher_id" foreign="publisher_id"/>
</foreign-key>
</table>
</database>
Das Wurzelelement <database> (siehe
Tabelle 12.1)
gruppiert die <table>-Elemente (siehe
Tabelle 12.2),
mit denen die einzelnen Tabellen spezifiziert werden. Mit den
<column>-Elementen (siehe
Tabelle 12.3)
werden die Spalten einer Tabelle spezifiziert.
Hierbei werden unter anderem der Datentyp sowie Schlüsselinformationen
festgelegt. Über ein <foreign-key>-Element
kann durch einen Fremdschlüssel eine Spalte einer anderen
Tabelle referenziert werden.
Tabelle 12.1. Attribute des <database>-Elementes
| Name | Verfügbare Werte | Standardwert | Erforderlich |
|---|---|---|---|
| name | Ja | ||
| defaultIdMethod | "native", "none" | "none" | Nein |
| package | Projektname | Nein | |
| baseClass | BaseObject | Nein | |
| basePeer | BasePeer | Nein | |
| defaultPhpNamingMethod | "nochange", "underscore", "phpname" | "underscore" | Nein |
| heavyIndexing | "true", "false" | "false" | Nein |
Tabelle 12.2. Attribute des <table>-Elementes
| Name | Verfügbare Werte | Standardwert | Erforderlich |
|---|---|---|---|
| name | Ja | ||
| idMethod | "native", "none" | "none" (oder Wert des Attributes defaultIdMethod des <database>-Elementes) | Nein |
| phpName | Nein | ||
| skipSql | "true", "false" | "false" | Nein |
| abstract | "true", "false" | "false" | Nein |
| phpNamingMethod | "nochange", "underscore", "phpname" | "underscore" (oder Wert des Attributes phpNamingMethod des <database>-Elementes) | Nein |
| baseClass | BaseObject (oder Wert des Attributes baseClass des <database>-Elementes) | Nein | |
| basePeer | BasePeer (oder Wert des Attributes basePeer des <database>-Elementes) | Nein | |
| description | Nein | ||
| heavyIndexing | "true", "false" | "false" (oder Wert des Attributes heavyIndexing des <database>-Elementes) | Nein |
Tabelle 12.3. Attribute des <column>-Elementes
| Name | Verfügbare Werte | Standardwert | Erforderlich |
|---|---|---|---|
| name | Ja | ||
| phpName | Nein | ||
| peerName | Nein | ||
| primaryKey | "true", "false" | "false" | Nein |
| required | "true", "false" | "false" | Nein |
| type | "BOOLEAN", "TINYINT", "SMALLINT", "INTEGER", "BIGINT", "DOUBLE", "FLOAT", "REAL", "DECIMAL", "CHAR", "VARCHAR", "LONGVARCHAR", "DATE", "TIME", "TIMESTAMP", "BLOB", "CLOB" | "VARCHAR" | Nein |
| size | Nein | ||
| scale | Nein | ||
| default | Nein | ||
| autoIncrement | "true", "false" | "false" | Nein |
| description | Nein | ||
| phpNamingMethod | "nochange", "underscore", "phpname" | "underscore" (oder Wert des Attributes phpNamingMethod des <table>-Elementes) | Nein |
| inheritance | "single", "false" | "false" | Nein |
| inputValidator | Nein |
Beispiel 12.2 zeigt
die Konfiguration des Objektspeichers für den Buchkatalog mit
der Konfigurationsdatei runtime-conf.xml.
Beispiel 12.2: Konfiguration des Objektspeichers in XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<config>
<log>
<ident>propel-books</ident>
<level>7</level>
</log>
<propel>
<datasources default="books">
<datasource id="books">
<adapter>mysql</adapter>
<connection>
<phptype>mysql</phptype>
<hostspec>localhost</hostspec>
<database>books</database>
<username>root</username>
<password></password>
</connection>
</datasource>
</datasources>
</propel>
</config>
Mit dem Propel-Generator können nun die für die Erzeugung der entsprechenden Datenbank und Tabellen benötigten SQL-Anweisungen (Beispiel 12.3) sowie die entsprechenden PHP-Klassen (Abbildung 12.5) erzeugt werden.
Abbildung 12.4. Datenbank-Schema und PHP-Klassen mit dem Propel-Generator erzeugen
propel-gen /home/sb/booksBeispiel 12.3: Die generierte Datei schema.sql
DROP TABLE IF EXISTS author;
CREATE TABLE author(
author_id INTEGER NOT NULL COMMENT 'Autor-ID',
first_name VARCHAR(128) NOT NULL COMMENT 'Autor Vorname',
last_name VARCHAR(128) NOT NULL COMMENT 'Autor Nachname',
PRIMARY KEY (author_id)
) TYPE=InnoDB COMMENT='Autor-Tabelle';
DROP TABLE IF EXISTS publisher;
CREATE TABLE publisher(
publisher_id INTEGER NOT NULL COMMENT 'Verlag-ID',
name VARCHAR(128) NOT NULL COMMENT 'Verlag-Name',
PRIMARY KEY (publisher_id)
) TYPE=InnoDB COMMENT='Verlag-Tabelle';
DROP TABLE IF EXISTS book;
CREATE TABLE book(
book_id INTEGER NOT NULL COMMENT 'Buch-ID',
title VARCHAR(255) NOT NULL COMMENT 'Buch-Titel',
isbn VARCHAR(24) NOT NULL COMMENT 'ISBN-Nummer',
author_id INTEGER NOT NULL COMMENT 'Fremdschlüssel Autor',
publisher_id INTEGER NOT NULL COMMENT 'Fremdschlüssel Verlag',
PRIMARY KEY (book_id),
INDEX (author_id),
FOREIGN KEY (author_id) REFERENCES author (author_id),
INDEX (publisher_id),
FOREIGN KEY (publisher_id) REFERENCES publisher (publisher_id)
) TYPE=InnoDB COMMENT='Buch-Tabelle';