Database Design Document

{{config | get(key="title", default="") }}

{% if group_list | length == 1 -%} {% if config.groups | length > 1 -%}

{{group_list.0.group_def.label | default(value=group_list.0.group_name) }}

{% endif -%} {% endif -%}

{{date | date(format="%x", locale=locale)}}

{% if history | length > 0 -%}
{% set_global history_idx = 0 %} {% for row in history -%} {% set description = row.description | history_description( AddTable='Add a table: {T}
', DropTable='Drop a table: {T}
', RenameTable='Rename a table: {T} ({C})
', AddColumn='Add a column: {T} ({C})
', AddColumn_Plural='Add columns: {T} ({C})
', ChangeColumn='Change a column: {T} ({C})
', ChangeColumn_Plural='Change columns: {T} ({C})
', DropColumn='Drop a column: {T} ({C})
', DropColumn_Plural='Drop columns: {T} ({C})
', RenameColumn='Rename a column: {T} ({C})
', RenameColumn_Plural='Rename columns: {T} ({C})
', ChangePrimary='Change the primary key: {T}
', DropPrimary='Drop the primary key: {T}
', AddIndex='Add an index: {T} ({C})
', AddIndex_Plural='Add indexes: {T} ({C})
', ChangeIndex='Change an index: {T} ({C})
', ChangeIndex_Plural='Change indexes: {T} ({C})
', DropIndex='Drop an index: {T} ({C})
', DropIndex_Plural='Drop indexes: {T} ({C})
', AddForeign='Add a foreign key: {T} ({C})
', AddForeign_Plural='Add foreign keys: {T} ({C})
', ChangeForeign='Change a foreign key: {T} ({C})
', ChangeForeign_Plural='Change foreign keys: {T} ({C})
', DropForeign='Drop a foreign key: {T} ({C})
', DropForeign_Plural='Drop foreign keys: {T} ({C})
', ) -%} {% if description | length == 0 %}{% continue %}{% endif -%} {% set_global history_idx = history_idx + 1 %} {% if history_idx == history_max %}{% break %}{% endif -%} {% endfor -%}

Revision History

Date Description
{{row.date | date(format="%x", locale=locale)}} {{- description | safe -}}
{% endif -%} {% if group_list | length > 1 -%}
{% for group in group_list -%} {% endfor -%}

Model Group List

No. Name
{{loop.index}} {{group.group_def.label | default(value=group.group_name)}}
{%- endif -%} {% for group in group_list -%}
{% if group_list | length > 1 -%}

{{group.group_def.label | default(value=group.group_name)}}

{% endif -%} {% if group.models -%}
{% for model_name, model in group.models -%} {% endfor -%}

Table List

No. Name
{{loop.index}} {{model_name}} {%- if model.label %} ({{model.label}}){% endif %}
{% if group.er -%}

ER diagram

{{group.er | safe}}
{% endif -%}
{% endif -%}
{% if group.models -%} {% for model_name, model in group.models -%}

{{loop.index}}. {{model_name}}{% if model.label %} ({{model.label}}){% endif %}

Real Table Name: {{model.table_name}}

{% if model.comment -%}
{{model.comment}}
{% endif -%}
{% for name, column in model.columns -%} {% endfor -%}
No. Logical Name Physical Name Type Null Length Key Comment
{{loop.index}} {{column | get(key="label", default="")}} {{column | get(key="column_name", default=name)}} {% if column.signed %}signed {% endif %}{{column.type}} {% if not column.not_null %}Y{% endif %} {%- if column.length %}{{column.length}}{% endif %} {%- if column.precision %}{{column.precision}}{% endif %} {%- if column.scale %},{{column.scale}}{% endif %} {% if column.primary %}P{% endif %} {%- if column.enum_values -%}

{% for enum in column.enum_values -%} {%- if enum.value is defined %} {{enum.value}}:{{enum | get(key="label", default=enum.name) }} {%- else %} {{enum.name}}{% if enum.label %}:{{enum.label}}{% endif %} {%- endif %} {%- if enum.comment %} ({{enum.comment}}){% endif %} {%- if not loop.last %}
{% endif %} {%- endfor %}

{%- endif -%} {%- if column.comment %}
{{column.comment}}
{% endif -%}

All numeric types including double, decimal, etc. are unsigned unless signed is specified for the data type.

{% if model.indexes -%}
{% for name, index in model.indexes -%} {% endfor -%}

Index List

No. Type Column Name
{{loop.index}} {%- if index %}{{index | get(key="type", default="INDEX") | upper}} {%- else %}INDEX{% endif %} {%- if index and index.fields %}{% for name, field in index.fields -%} {%- if field and field.query %}({{field.query}}){% else %}{{name}}{%- if field and field.length %}({{field.length}}){% endif %}{% endif %} {%- if not loop.last %}, {% endif %} {%- endfor %}{% else %}{{name}}{% endif %}
{% endif -%} {% if model.relations -%}
{% for name, relation in model.relations -%} {% set type = relation | get(key="type") %} {% endfor -%}

Relation List

No. Name Local Column Type Foreign Table Foreign Column On Delete
{{loop.index}} {{relation | get(key="label", default=name)}} {%- if relation.local %}{{relation.local | join(sep=", ")}}{% else %} {%- if type == "has_many" or type == "has_one" %}
-
{% else %}{{name}}_id{% endif %} {%- endif %}
{{type | upper}} {{- relation.model | split(pat="::") | last}} {%- if relation.foreign %}{{relation.foreign | join(sep=", ")}}{% else %} {%- if type == "has_many" %}{{model_name}}_id{% else %}
-
{% endif %} {%- endif %}
{{relation | get(key="on_delete", default="")}}

"-" in column indicates primary key. {%- if config.ignore_foreign_key %} No foreign key constraint is actually set.{% endif -%}

{% endif -%}
{% endfor -%} {% endif -%} {% endfor -%}