SchemaSchema is a language I wrote for declaring a data model and a Java library that interprets it. Here’s some example schema:

resource class 'provider type' : scope @ constant {
        provider type code : string : key(primary)
        name : string
        is community resource type : boolean
    resource class 'provider' : scope @ org-tree {
        ID : entity ID : key(primary)
        defining organization ID : entity ID
        provider type code : string
        name : string : nullable
        name prefix : string : nullable
        first name : string : nullable
        last name : string : nullable
        name suffix : string : nullable
        description : string
        e-mail address : string : nullable
        phone number : string : nullable
        website URL : string : nullable
        address : postal address : nullable

You may ask: Why not just write your CREATE TABLE scripts in SQL and call that your data model?

SchemaSchema allows you to define common data types and use them over and over. If the definitions change (e.g. a user ID used to be represented as a 32-bit integer but now it needs to be 64 bits) you can simply change the definition and re-generate your table creation SQL. If you need to upgrade your database, you can use SchemaSchema to find all columns of type ‘user ID’ and write the appropriate ALTER TABLE statements.

SchemaSchemas can also declare things about your schema that aren’t limited to how it’s represented in the database. E.g. you can indicate how certain values should be encoded in JSON or PHP. In First30 we have various object ‘scopes’ that influence who is allowed to view and edit them, and the SchemaSchema document indicates the scope for each table, allowing us to auto-generate data used by the permission checking functions and service tests.

The result of all this auto-generation is that when we need to change something about our schema, we can change it once in schema.txt and let the computer do all the work that for a human to do would be incredibly tedious and error-prone (updating the database and all references to the changed tables).

The schema document also serves as a central piece of documentation that’s more easily readable than your table creation SQL.