Browse Source

chore: updates README.md

e22m4u 2 years ago
parent
commit
6f0b65ecb2
1 changed files with 85 additions and 7 deletions
  1. 85 7
      README.md

+ 85 - 7
README.md

@@ -35,7 +35,9 @@ flowchart LR
 A[Datasource]-->B[Model]-->С[Repository];
 ```
 
-## Пример
+## Использование
+
+#### Точка входа
 
 Определения источников и моделей хранятся в экземпляре класса `Schema`,
 и первым шагом в проектировании системы будет создание данного экземпляра.
@@ -47,14 +49,16 @@ const schema = new Schema();
 ```
 
 Интерфейс экземпляра `Schema` содержит три основных метода, два из которых
-позволяют определить источник и модель, а третий возвращает репозиторий по
-названию модели.
+позволяют определить источник данных и модель, а третий возвращает репозиторий
+по названию модели.
 
 - `defineDatasource(datasourceDef: object): this`
 - `defineModel(modelDef: object): this`
 - `getRepository(modelName: string): Repository`
 
-Источник данных описывает способ подключения к базе, и используемый адаптер.
+#### Источник данных
+
+Источник описывает способ подключения к базе, и используемый адаптер.
 Если адаптер имеет настройки, то они передаются в объекте определения
 источника методом `defineDatasource`, как это показано ниже.
 
@@ -80,9 +84,83 @@ schema.defineDatasource({
 });
 ```
 
-Когда источники определены, можно перейти на следующий слой абстракции,
-где описываются модели данных. Модель может определять как структуру
-какого-либо объекта, так и являться отражением реальной коллекции базы.
+#### Модель данных
+
+Когда источники данных определены, можно перейти на следующий уровень
+абстракции, где описываются модели данных. Модель может определять как
+структуру какого-либо объекта, так и являться отражением реальной
+коллекции базы.
+
+Представьте себе коллекцию торговых точек, у каждой из которых имеются
+координаты `lat` и `lng`. Мы могли бы заранее определить модель для
+объекта координат, и использовать его в других коллекциях.
+
+```js
+schema.defineModel({
+  name: 'latLng', // название новой модели
+  properties: { // поля модели
+    lat: DataType.NUMBER, // поле широты
+    lng: DataType.NUMBER, // поле долготы
+  },
+});
+```
+
+Модель `latLng` всего лишь описывает структуру объекта координат, тогда
+как торговая точка должна иметь реальную таблицу в базе. По аналогии с
+предыдущим примером, добавим модель `place`, но укажем не только название
+модели и ее поля, а еще и источник данных в параметре `datasource`
+
+```js
+schema.defineModel({
+  name: 'place',
+  datasource: 'myMemory', // выбранный источник данных
+  properties: {
+    name: DataType.STRING, // поле для названия торговой точки
+    location: { // поле объекта координат
+      type: DataType.OBJECT, // допускать только объекты
+      model: 'latLng', // определение структуры объекта
+    },
+  },
+});
+```
+
+В примере выше мы использовали модель `latLng` как структуру допустимого
+значения поля `location`. Возможный документ данной коллекции может
+выглядеть так:
+
+```json
+{
+  "id": 1,
+  "name": "Burger King at Avenue Mall",
+  "location": {
+    "lat": 32.412891,
+    "lng": 34.7660061
+  }
+}
+```
+
+Стоит обратить внимание, что мы могли бы не объявлять параметр `properties`,
+при этом теряя возможность проверки данных перед записью в базу.
+
+```js
+schema.defineModel({
+  name: 'place',
+  adapter: 'myMemory',
+  // параметр "properties" не указан
+});
+```
+
+#### Репозиторий
+
+В отличие от `latLng`, модель `place` имеет источник данных с названием
+`myMemory`, который был объявлен ранее. Наличие источника позволяет получить
+репозиторий для данной модели.
+
+```js
+const rep = schema.getRepository('place');
+```
+
+## Пример
 
 Создаем модель `user`