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