Mercurial > pub > ModelGenerator
comparison readme.md @ 2:035de8b7b18e
Temporary commit, refactoring, added readme
| author | cin |
|---|---|
| date | Sun, 25 Feb 2018 17:12:33 +0300 |
| parents | |
| children | d3542662cf70 |
comparison
equal
deleted
inserted
replaced
| 1:7f803979305f | 2:035de8b7b18e |
|---|---|
| 1 | |
| 2 # SINOPSYS | |
| 3 | |
| 4 ```xml | |
| 5 <package | |
| 6 xmlns="http://implab.org/schemas/data-model.v1.xsd" | |
| 7 name="simple-model" | |
| 8 > | |
| 9 <!-- import predefined types --> | |
| 10 <import href="types.xml"/> | |
| 11 | |
| 12 <!-- define entity --> | |
| 13 <entity name="Order"> | |
| 14 <!-- define primary key --> | |
| 15 <primaryKey name="Id" type="uuid"/> | |
| 16 | |
| 17 <!-- define simple property --> | |
| 18 <property name="OrderDate" type="dateTime"/> | |
| 19 | |
| 20 <!-- define hasA relation --> | |
| 21 <hasA name="Item" type="Item"> | |
| 22 <!-- specified a property which holds reference --> | |
| 23 <thisKey name="ItemId"/> | |
| 24 </hasA> | |
| 25 | |
| 26 <!-- define hasMany relation --> | |
| 27 <hasMany name="Comments" type="OrderComment"> | |
| 28 <otherKey name="Order"/> | |
| 29 </hasMany> | |
| 30 </entity> | |
| 31 | |
| 32 <entity name="Item"> | |
| 33 <primaryKey name="Id" type="uuid"/> | |
| 34 | |
| 35 <property name="Title" type="string" /> | |
| 36 | |
| 37 </entity> | |
| 38 | |
| 39 <entity name="OrderComment"> | |
| 40 <primaryKey name="Id" type="uuid" /> | |
| 41 | |
| 42 <property name="Comment" type="text" /> | |
| 43 | |
| 44 <property name="Date" type="dateTime" /> | |
| 45 | |
| 46 <hasA name="Order" type="Order"> | |
| 47 <thisKey name="OrderId" /> | |
| 48 </hasA> | |
| 49 </entity> | |
| 50 </package> | |
| 51 ``` | |
| 52 | |
| 53 # DESCRIPTION | |
| 54 | |
| 55 Описание модели включает в себя описание наборов сущностей, каждый набор | |
| 56 называется пакетом. | |
| 57 | |
| 58 В пакете содержатся описания сущностей, а также объявления внешних типов, | |
| 59 которые используются при описании сущностей. | |
| 60 | |
| 61 Для уменьшения количества дублируемого кода, а также для упрощения читаемости | |
| 62 и упрощения сопровождения существует возможность импортирования уже объявленных | |
| 63 пакетов. В процессе сборки происходит предварительная обработка, которая | |
| 64 использует все директивы `import` для составления общего модуля, состоящего | |
| 65 из нескольких пакетов, при этом пакет с которого был начат процесс сборки | |
| 66 называется первичным и после окончания предварительной обработки для него будет | |
| 67 выполнена сборка. | |
| 68 | |
| 69 Каждая сущность модели состоит из нескольких типов членов, это | |
| 70 * Свойства - используются для хранения состояния сущности, аналогичны столбцам в таблице | |
| 71 * Ключи - информация для идентификации записей, каждая запись должна иметь по крайней мере первичный ключ. | |
| 72 * Отношения - информация о связях между сущностями | |
| 73 | |
| 74 ## Properties | |
| 75 | |
| 76 ## PrimaryKey | |
| 77 | |
| 78 Внешний ключ представляет собой набор уникальных данных, позволяющий однозначно | |
| 79 идентифицировать запись, при этом внешний ключ может состоять как из одного | |
| 80 поля (простые), так и из нескольких (составные) | |
| 81 | |
| 82 Простые первичные ключи | |
| 83 | |
| 84 ```xml | |
| 85 <primaryKey name="Id" type="uuid"/> | |
| 86 ``` | |
| 87 | |
| 88 Составные первичные ключи | |
| 89 | |
| 90 ```xml | |
| 91 <primaryKey name="Id"> | |
| 92 <member name="Owner"/> | |
| 93 <member name="SeqNum"/> | |
| 94 </primaryKey> | |
| 95 <property name="SeqNum" type="integer"/> | |
| 96 <hasA name="Owner" type="User"> | |
| 97 <thisKey name="UserId" /> | |
| 98 </hasA> | |
| 99 ``` | |
| 100 При описании составных ключей перечисляется набор членов сущности, которые | |
| 101 будут образовывать уникальный набор данных для первичного ключа, следует | |
| 102 отметить, что не все отношения храняться в самой сущности, например, | |
| 103 `hasMany` может хранится не в записях самой сущности, а в записях связанной | |
| 104 сущности, такие отношения нельзя включать в первичный ключ. | |
| 105 Отношение `hasA`, напротив, как парвило хранится в свойствах самой сущности | |
| 106 и включение его в первичный ключ означает автоматическое включение всех | |
| 107 свойств. | |
| 108 | |
| 109 ## Relations | |
| 110 | |
| 111 ### hasA | |
| 112 | |
| 113 `hasA` это отношение, при котором текущей сущности может | |
| 114 соответсвовать одна связанная сущность. При реализации | |
| 115 данного отношение может быть указано свойство, используемое | |
| 116 для хранения ссылки при помощи дочернего элемента `thisKey` | |
| 117 | |
| 118 `thisKey` указывает способ реализации отношения, при котором | |
| 119 в текущей сущности хранится информация для осуществления связи. | |
| 120 | |
| 121 По-умолчанию для связи используются первичные ключи, что | |
| 122 позволяет автоматически определять набор и типы необходимых | |
| 123 свойств для хранения ссылки. | |
| 124 | |
| 125 ```xml | |
| 126 <hasA name="Order" type="Order" optional="true"> | |
| 127 <thisKey name="OrderId" /> | |
| 128 </hasA> | |
| 129 ``` | |
| 130 | |
| 131 В случях когда первичный ключ является сложным можно указать | |
| 132 префикс или явно перечислить свойства в которых будет хранится | |
| 133 связь | |
| 134 | |
| 135 ```xml | |
| 136 <property name="UserId" type="uuid"/> | |
| 137 <property name="MemberNo" type="integer"/> | |
| 138 <hasA name="Membership" type="Membership"> | |
| 139 <thisKey> | |
| 140 <member name="UserId"/> | |
| 141 <member name="MemberNo"/> | |
| 142 </thisKey> | |
| 143 </hasA> | |
| 144 ``` | |
| 145 | |
| 146 ### hasMany | |
| 147 | |
| 148 Отношение при котором с текущей записью связано произвольное | |
| 149 количество записей другой сущности. | |
| 150 | |
| 151 Как правило это отношение является комплиментарным к `hasA` с другой стороны. | |
| 152 | |
| 153 ```xml | |
| 154 <hasMany name="Roles" type="Role"> | |
| 155 <otherKey name="User"/> | |
| 156 </hasMany> | |
| 157 ``` | |
| 158 | |
| 159 `otherKey` указывает имя члена в связанной сущности, который хранит информацию | |
| 160 о связи, это может быть оношение, свойство или ключ. |
