Mercurial > pub > ModelGenerator
diff readme.md @ 2:035de8b7b18e
Temporary commit, refactoring, added readme
author | cin |
---|---|
date | Sun, 25 Feb 2018 17:12:33 +0300 |
parents | |
children | d3542662cf70 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/readme.md Sun Feb 25 17:12:33 2018 +0300 @@ -0,0 +1,160 @@ + +# SINOPSYS + +```xml +<package + xmlns="http://implab.org/schemas/data-model.v1.xsd" + name="simple-model" +> + <!-- import predefined types --> + <import href="types.xml"/> + + <!-- define entity --> + <entity name="Order"> + <!-- define primary key --> + <primaryKey name="Id" type="uuid"/> + + <!-- define simple property --> + <property name="OrderDate" type="dateTime"/> + + <!-- define hasA relation --> + <hasA name="Item" type="Item"> + <!-- specified a property which holds reference --> + <thisKey name="ItemId"/> + </hasA> + + <!-- define hasMany relation --> + <hasMany name="Comments" type="OrderComment"> + <otherKey name="Order"/> + </hasMany> + </entity> + + <entity name="Item"> + <primaryKey name="Id" type="uuid"/> + + <property name="Title" type="string" /> + + </entity> + + <entity name="OrderComment"> + <primaryKey name="Id" type="uuid" /> + + <property name="Comment" type="text" /> + + <property name="Date" type="dateTime" /> + + <hasA name="Order" type="Order"> + <thisKey name="OrderId" /> + </hasA> + </entity> +</package> +``` + +# DESCRIPTION + +Описание модели включает в себя описание наборов сущностей, каждый набор +называется пакетом. + +В пакете содержатся описания сущностей, а также объявления внешних типов, +которые используются при описании сущностей. + +Для уменьшения количества дублируемого кода, а также для упрощения читаемости +и упрощения сопровождения существует возможность импортирования уже объявленных +пакетов. В процессе сборки происходит предварительная обработка, которая +использует все директивы `import` для составления общего модуля, состоящего +из нескольких пакетов, при этом пакет с которого был начат процесс сборки +называется первичным и после окончания предварительной обработки для него будет +выполнена сборка. + +Каждая сущность модели состоит из нескольких типов членов, это +* Свойства - используются для хранения состояния сущности, аналогичны столбцам в таблице +* Ключи - информация для идентификации записей, каждая запись должна иметь по крайней мере первичный ключ. +* Отношения - информация о связях между сущностями + +## Properties + +## PrimaryKey + +Внешний ключ представляет собой набор уникальных данных, позволяющий однозначно +идентифицировать запись, при этом внешний ключ может состоять как из одного +поля (простые), так и из нескольких (составные) + +Простые первичные ключи + +```xml +<primaryKey name="Id" type="uuid"/> +``` + +Составные первичные ключи + +```xml +<primaryKey name="Id"> + <member name="Owner"/> + <member name="SeqNum"/> +</primaryKey> +<property name="SeqNum" type="integer"/> +<hasA name="Owner" type="User"> + <thisKey name="UserId" /> +</hasA> +``` +При описании составных ключей перечисляется набор членов сущности, которые +будут образовывать уникальный набор данных для первичного ключа, следует +отметить, что не все отношения храняться в самой сущности, например, +`hasMany` может хранится не в записях самой сущности, а в записях связанной +сущности, такие отношения нельзя включать в первичный ключ. +Отношение `hasA`, напротив, как парвило хранится в свойствах самой сущности +и включение его в первичный ключ означает автоматическое включение всех +свойств. + +## Relations + +### hasA + +`hasA` это отношение, при котором текущей сущности может +соответсвовать одна связанная сущность. При реализации +данного отношение может быть указано свойство, используемое +для хранения ссылки при помощи дочернего элемента `thisKey` + +`thisKey` указывает способ реализации отношения, при котором +в текущей сущности хранится информация для осуществления связи. + +По-умолчанию для связи используются первичные ключи, что +позволяет автоматически определять набор и типы необходимых +свойств для хранения ссылки. + +```xml +<hasA name="Order" type="Order" optional="true"> + <thisKey name="OrderId" /> +</hasA> +``` + +В случях когда первичный ключ является сложным можно указать +префикс или явно перечислить свойства в которых будет хранится +связь + +```xml +<property name="UserId" type="uuid"/> +<property name="MemberNo" type="integer"/> +<hasA name="Membership" type="Membership"> + <thisKey> + <member name="UserId"/> + <member name="MemberNo"/> + </thisKey> +</hasA> +``` + +### hasMany + +Отношение при котором с текущей записью связано произвольное +количество записей другой сущности. + +Как правило это отношение является комплиментарным к `hasA` с другой стороны. + +```xml +<hasMany name="Roles" type="Role"> + <otherKey name="User"/> +</hasMany> +``` + +`otherKey` указывает имя члена в связанной сущности, который хранит информацию +о связи, это может быть оношение, свойство или ключ. \ No newline at end of file