2
|
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
|
9
|
74 Ключи рассматриваются являются специальным видом отношений, оны выделены отдельно
|
|
75 поскольку в генераторе моделей для них предусмотрены специальные механизмы, используемые
|
|
76 при реализации отношений.
|
|
77
|
2
|
78 ## Properties
|
|
79
|
|
80 ## PrimaryKey
|
|
81
|
|
82 Внешний ключ представляет собой набор уникальных данных, позволяющий однозначно
|
|
83 идентифицировать запись, при этом внешний ключ может состоять как из одного
|
|
84 поля (простые), так и из нескольких (составные)
|
|
85
|
|
86 Простые первичные ключи
|
|
87
|
|
88 ```xml
|
|
89 <primaryKey name="Id" type="uuid"/>
|
|
90 ```
|
|
91
|
|
92 Составные первичные ключи
|
|
93
|
|
94 ```xml
|
|
95 <primaryKey name="Id">
|
|
96 <member name="Owner"/>
|
|
97 <member name="SeqNum"/>
|
|
98 </primaryKey>
|
|
99 <property name="SeqNum" type="integer"/>
|
|
100 <hasA name="Owner" type="User">
|
|
101 <thisKey name="UserId" />
|
|
102 </hasA>
|
|
103 ```
|
|
104 При описании составных ключей перечисляется набор членов сущности, которые
|
|
105 будут образовывать уникальный набор данных для первичного ключа, следует
|
|
106 отметить, что не все отношения храняться в самой сущности, например,
|
|
107 `hasMany` может хранится не в записях самой сущности, а в записях связанной
|
|
108 сущности, такие отношения нельзя включать в первичный ключ.
|
|
109 Отношение `hasA`, напротив, как парвило хранится в свойствах самой сущности
|
|
110 и включение его в первичный ключ означает автоматическое включение всех
|
|
111 свойств.
|
|
112
|
|
113 ## Relations
|
|
114
|
|
115 ### hasA
|
|
116
|
|
117 `hasA` это отношение, при котором текущей сущности может
|
|
118 соответсвовать одна связанная сущность. При реализации
|
|
119 данного отношение может быть указано свойство, используемое
|
|
120 для хранения ссылки при помощи дочернего элемента `thisKey`
|
|
121
|
|
122 `thisKey` указывает способ реализации отношения, при котором
|
|
123 в текущей сущности хранится информация для осуществления связи.
|
|
124
|
|
125 По-умолчанию для связи используются первичные ключи, что
|
|
126 позволяет автоматически определять набор и типы необходимых
|
|
127 свойств для хранения ссылки.
|
|
128
|
|
129 ```xml
|
|
130 <hasA name="Order" type="Order" optional="true">
|
|
131 <thisKey name="OrderId" />
|
|
132 </hasA>
|
|
133 ```
|
|
134
|
|
135 В случях когда первичный ключ является сложным можно указать
|
|
136 префикс или явно перечислить свойства в которых будет хранится
|
|
137 связь
|
|
138
|
|
139 ```xml
|
|
140 <property name="UserId" type="uuid"/>
|
|
141 <property name="MemberNo" type="integer"/>
|
|
142 <hasA name="Membership" type="Membership">
|
|
143 <thisKey>
|
|
144 <member name="UserId"/>
|
|
145 <member name="MemberNo"/>
|
|
146 </thisKey>
|
|
147 </hasA>
|
|
148 ```
|
|
149
|
|
150 ### hasMany
|
|
151
|
|
152 Отношение при котором с текущей записью связано произвольное
|
|
153 количество записей другой сущности.
|
|
154
|
|
155 Как правило это отношение является комплиментарным к `hasA` с другой стороны.
|
|
156
|
|
157 ```xml
|
|
158 <hasMany name="Roles" type="Role">
|
|
159 <otherKey name="User"/>
|
|
160 </hasMany>
|
|
161 ```
|
|
162
|
|
163 `otherKey` указывает имя члена в связанной сущности, который хранит информацию
|
|
164 о связи, это может быть оношение, свойство или ключ. |