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 о связи, это может быть оношение, свойство или ключ. |