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.