SchemaGuidelines
================

We want our schemas to be as portable as possible. In particular they should
be compatible with SQLite, MySQL, PostgreSQL and Oracle.
All the current schemas (i.e. the *_DB.sql files in schemas_0.9/ and
schemas_1.0/) have been successfully tested (i.e. imported) with SQLite
(3.4.1), MySQL+InnoDB (5.0.26) and PostgreSQL (8.1.9) on a 64-bit openSUSE
10.2 system. They have not been tested on Oracle yet.

o All of the *_DB.sql files must define a "metadata" table (with cols "name"
  and "value") and all the *.sqlite files using one of these schemas must
  have a 'DBSCHEMA' and a 'DBSCHEMAVERSION' entry in their "metadata" table.

o Make explicit use of the NULL or NOT NULL constraint on every column (except
  on PRIMARY KEY cols that are implicitly NOT NULL).

o Centralize all the data type definitions in the DataTypes.txt file and use
  them consistently across all the *_DB.sql files.

o Use preferably CHAR(n) or VARCHAR(n) types instead of non-standard TEXT type
  for character columns. Note that n must be <= 255 for compatibility with
  MySQL. Don't define an INDEX (or try to put a UNIQUE constraint, which
  implicitly creates an INDEX) on a TEXT column since this is not portable.
  Also don't define an INDEX on a CHAR(n) or VARCHAR(n) column where n is
  large (i.e. > 80) since this is not portable either. Doing so when n <= 80
  should be safe though.

o Always use a character type for "external" (aka "real world") ids even for
  ids like Entrez Gene IDs, PubMed IDs or OMIM IDs that are in fact integers.

o Put PRIMARY KEY and UNIQUE definitions "in line" at the end of the column
  definition (after the SQL type and the NULL/NOT NULL constraint for UNIQUE).

o Make the PRIMARY KEY column the first column in the CREATE TABLE statement.

o Put "regular" (i.e. non PRIMARY KEY, non UNIQUE) INDEX definitions all
  together at the end of the *_DB.sql file.

o Make sure that referenced tables are created before referencing tables.

o Make the FOREIGN KEYs portable. This means that:
    - Use portable syntax. Putting 
        FOREIGN KEY (col) REFERENCES table (col)
      inside the CREATE TABLE statement but at the end of it (after all the
      column definitions) is compatible with SQLite (which will just ignore
      it), MySQL+InnoDB and PostgreSQL.
    - There must be NOT NULL and UNIQUE constraints on the referenced column
      (typically a PRIMARY KEY).
    - The referencing and referenced columns must have the same type.

o Prefix with an underscore the column names that store "internal" ids.

