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