blob: 82f79501faaa41526fa8c0df46216642af504994 [file] [log] [blame]
eZ publish Enterprise Component: DatabaseSchema, Design
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Introduction
============
Purpose of the DatabaseSchema component
---------------------------------------
The DatabaseSchema component is meant to represent database schema/data
in a portable format.
Thus, the following functionality is provided:
- to transfer schema/data between two databases, even running under
different DBMSs;
- to compare schemas of two databases (generate a diff);
- to synchronize schema between two databases (apply the diff);
- to represent schema/data in misc formats, such as XML, PHP array and SQL.
Design
======
Basic concepts
--------------
The main design idea of the component is the usage of *schema*
*handlers*. A user deals with schema object, loading/saving schema
to/from it. But actual schema operations are done in concrete handlers,
loaded depending on *storage* *type* (=where are you saving/loading
schema to/from). For example, if you're loading schema from an XML file,
the XML handler is used; if you're saving schema to a MySQL database,
the MySQL handler is used.
The component consists of the following main classes:
- ezcDbSchema
- ezcDbSchemaHandler
- ezcDbSchemaHandlerManager
ezcDbSchema
-----------
It is the main class for schema operation, representing the schema itself.
Provides ability to load/save schema from/to files, databases or other
sources/destinations, depending on available schema handlers.
Besides, it allows to get schema without saving it to a file/database in
one of the internal formats: PHP array, XML string, DOM tree, set of SQL
queries.
You can compare two schemas and save the difference to a file.
ezcDbSchemaHandler
------------------
A schema handler knows everything about a specific storage type. If it
is a database, the handler knows how to fetch schema of a database or
fill a database with schema. If it is a file, the handler know how to
parse or generate it.
ezcDbSchemaHandler is the base class for all handlers.
ezcDbSchemaHandlerManager
-------------------------
Keeps list of known handlers.
Determines what handler to use for the specified storage type.
User is able to register his/her custom handler with this class.
Schema format
=============
To be defined later.
Besides several SQL dialects, we're going to use two generic schema
definition formats: PHP array and XML.
PHP array format is going to be very similar to the one we use currently
in eZ publish dbschema library.
Schema transformations
======================
The component deals with different DBMSs having differences in the way
database structure is defined. Since when loading a schema from DB we
always try to keep maximum information, the differences remain in the
loaded schemas. When transferring schema from a database of type X to a
target database of type Y we of course have to transform the schema so
that it can be understood by the target DBMS. Besides, before comparing
schemas of different types we must make them comparamble (=of the same
type).
Thus, schema transformation mechanism is required. Since even different
versions of the same DBMS may have differences in their features, it is
not always possible to convert e.g. "mysql" schema to "pgsql" one.
Instead, each DBMS is descrbed by a set of features it supports. All the
transformations are done between those feature sets.
Only a very basic set of features is supported by the component
out-of-the box, and there is an ability to execute user-specified
transformations (see ezcDbSchema::__construct()). There are two hooks
defined for this. The first "feature detection hook" is called after a
schema has been loaded to detect which features does the schema contain.
The second hook is called "schema transformation hook" and is called
when the schema is about to be compared to another one or saved. It is
up to the user to define how feature detection and schema
transformations should work. Usually the user just creates a class
derived from ezcDbSchema and implements all the transformations there.
How to use
==========
Usually the component is used in the following way:
- User creates an object of ezcDbSchema class (or one of its descendants).
- The object is then used to load schema, save it or compare with another
schema object.
Examples
========
Example 1:
----------
::
$schema = new ezcDbSchema();
$schema->load( 'file.php', 'php-file' );
$schema->save( 'file.xml', 'xml-file' );
In this example we load schema from file.php containing schema array.
Then the schema is saved in file.xml using XML format.