Database Schema

The schema for schema.xml contains a small number of elements with required and optional attributes. The Propel generator contains a DTD (source:trunk/generator/dtd/database.dtd) that can be used to validate your schema.xml document. Also, when you build your SQL and OM, the Propel generator will automatically validate your schema.xml file using a new, highly-detailed XSD (source:trunk/generator/resources/xsd/database.xsd).

At-a-Glance

The hierarchical tree relationship for the elements is:

<database>
   <external-schema />
   <table>
     <column>
       <inheritance />
     </column>
     <foreign-key>
       <reference />
     </foreign-key>
     <index>
       <index-column />
     </index>
     <unique>
       <unique-column />
     </unique>
     <id-method-parameter/>
   </table>
</database>

Detailed Reference

This page provides an alternate rendering of the Appendix B - Schema Reference from the user's guide. It spells out in specific detail, just where each attribute or element belongs.

First, some conventions:

  • Text surrounded by a / is text that you would provide and is not defined in the language. (i.e. a table name is a good example of this.)
  • Optional items are surrounded by [ and ] characters.
  • Items where you have an alternative choice have a | character between them (i.e. true|false)
  • Alternative choices may be delimited by { and } to indicate that this is the default option, if not overridden elsewhere.
  • ... means repeat the previous item.

<database> element

Starting with the <database> element. The attributes and elements available are:

  <database 
    name="/DatabaseName/" 
    defaultIdMethod="native|none" 
    [package="/ProjectName/"] 
    [baseClass="/baseClassName/"]
    [basePeer="/baseClassPeerName/"]
    [defaultPhpNamingMethod="nochange|underscore|phpname"
    [heavyIndexing="true|false"]
  >
    <external-schema>
    <table>
    ...
  </database>

The package, baseClass, basePeer, defaultPhpNamingMethod, and heavyIndexing attributes are generally optional. A Database element may include an <external-schema> element, or multiple <table> elements.

<external-schema> element

The <external-schema> element is pretty simple. It just includes a schema file from somewhere on the file systems. The format is:

  <external-schema filename="/a path to a file/" />

<table> element

The <table> element is the most complicated of the usable elements. Its definition looks like this:

  <table 
     name = "/TableName/"
     [idMethod = "native|{none}"]
     [phpName = "/PhpObjectName/"]
     [skipSql = "true|false"]
     [abstract = "true|false"]
     [phpNamingMethod = "nochange|{underscore}|phpname"]
     [baseClass = "/baseClassName/"]
     [basePeer = "/baseClassPeerName/"]
     [description="/A text description of the table/"]
     [heavyIndexing = "true|false"]
     [readOnly = "true|false"]
  >

    <column>
    ...
    <foreign-key>
    ...
    <index>
    ...
    <unique>
    ...
    <id-method-parameter>
    ...
  </table>

According to the schema, name is the only required attribute. Also, the idMethod, phpNamingMethod, baseClass, basePeer, and heavyIndexing attributes all default to what is specified by the <database> element.

<column> element

  <column
    name = "/ColumnName/"
    [phpName = "/PHPColumnName/"]
    [peerName = "/PEERNAME/"]
    [primaryKey = "true|{false}"]
    [required = "true|{false}"]
    [type = "BOOLEAN|TINYINT|SMALLINT|INTEGER|BIGINT|DOUBLE|FLOAT|REAL|DECIMAL|CHAR|{VARCHAR}|LONGVARCHAR|DATE|TIME|TIMESTAMP|BLOB|CLOB"]
    [size = "/NumericLengthOfColumn/"]
    [scale = "/DigitsAfterDecimalPlace/"]
    [default = "/AnyDefaultValueMatchingType/"]
    [autoIncrement = "true|{false}"]
    [description = "/Column Description/"]
    [phpNamingMethod = "nochange|underscore|phpname"]
    [inheritance = "single|{false}"]
    [inputValidator = "NameOfInputValidatorClass"]
   >
   [<inheritance key="/KeyName/" class="/ClassName/" [extends="/BaseClassName/"] />]
   </column>

<foreign-key> element

To link a column to another table use the following syntax:

  <foreign-key 
     foreignTable = "/TheOtherTableName/"
     [name = "/Name for this foreign key/"]
     [onDelete = "cascade|setnull|{restrict}"]
  >
    <reference local="/LocalColumnName/" foreign="/ForeignColumnName/" />
  </foreign-key>

<index> element

To create an index on one or more columns, use the following syntax:

  <index>
     <index-column name="/ColumnName/" [size="/LengthOfIndexColumn/"] />
     ...
  </index>

In some cases your RDBMS may require you to specify an index size.

<unique> element

To create a unique index on one or more columns, use the following syntax:

  <unique>
     <unique-column name="/ColumnName/" [size="/LengthOfIndexColumn/"] />
     ...
  </unique>

In some cases your RDBMS may require you to specify an index size for unique indexes.

<id-method-parameter> element

If you are using a database that uses sequences for auto-increment columns (e.g. PostgreSQL or Oracle), you can customize the name of the sequence using the <id-method-paramter/> tag:

  <id-method-parameter value="my_custom_sequence_name"/>