Spezifizieren des Datenmodells in XML

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

NameVerfügbare WerteStandardwertErforderlich
name  Ja
defaultIdMethod"native", "none""none"Nein
package ProjektnameNein
baseClass BaseObjectNein
basePeer BasePeerNein
defaultPhpNamingMethod"nochange", "underscore", "phpname""underscore"Nein
heavyIndexing"true", "false""false"Nein


Tabelle 12.2. Attribute des <table>-Elementes

NameVerfügbare WerteStandardwertErforderlich
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

NameVerfügbare WerteStandardwertErforderlich
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/books


Beispiel 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';