Данные и источники данных

Основные понятия

Для описания объектной модели в Honey Platform используются понятия класса (class), связи (link) и объекта.

Объект

В отличие от общепринятых ORM-подходов (уточнить так ли это), где объектом является экземпляр некоторого класса, идентификатор, как правило, является уникальным ключом объекта, в Honey Platform используется подход, позволяющий наделить любой объект произвольным набором классов.

Обязательным атрибутом объекта будет являться его идентификатор - Id. Это строковое значение.

Класс

Под классом в платформе понимается некая роль (ипостась, функциональность), которой можно наделить объект. Класс содержит наименование, источник данных (по умолчанию) и список значений (Properties).

Класс описывается в файле с расширением class (в основном проекте или в модуле) (дать ссылку на модули и структуру проекта) в формате yaml (пока используется json).

Пример описания класса

Name: Person
DataSource: person_storage
Properties:
 - Name: FullName
   Type: string
 - Name: Age
   Type: decimal
 - Name: Sex
   Type: @Sex  

В примере выше описан класс с именем Person. Имя класса должно быть уникальным для всего проекта.

Далее указан источник данных по умолчанию - PersonStorage. По умолчанию - так как данное значение может быть переопределено для конкретного контура.

Ещё ниже указан список значений - Properties. Список может быть пустым.

Каждое значение имеет два обязательных параметра - Name и Type. Список остальных полей и список всех типов описан в разделе Properties (дать ссылку, возможно. переименовать).

Если тип значения начинается с символа @ - это означает, что свойство будет одним из типов, определённым пользователем - Enum или Record. Иначе необходимо использовать один из встроенных типов данных.

Если объект наделяется классом, содержащим непустой список значений, для него создаются данные по классу (звучит криво, подобрать термин покрасивее) - ClassValues, которые будут управляться источником данных.

Источник данных (DataSource)

DataSource - источник данных - сервис, который отвечает за хранение, выдачу и изменение данных по классу (ClassValues), а так же данных по связям между объектами (link).

Один источник данных может обрабатывать множество различных данных по различным классам и линкам. Источник данных может как только хранить данные (readonly), так и предоставлять возможность для изменения (write).

Описание источника данных задаётся в файле с расширением datasource в формате yaml или json. Некоторые данные могут быть изменены для конкретных контуров.

Пример

{
    "Name": "person_storage",
    "Type": "file",
    "Parameters": {
        "resourcename": "person_storage_data"
    }
}

В примере выше описан источник данных с именем person_storage. Имя должно быть уникальным в рамках проекта.

Далее описан тип источника данных - Type и список параметров Parameters, соответствующий выбранному типу.

Тип источника данных может быть либо одним из стандартных, либо пользовательским (тип custom).

Стандартные источники данных:

  • Тип file - данные описываются в json иди yaml формате, в файле, хранящимся в ресурсах. Источник read-only. Обязательный параметр - resourcename - указывает имя ресурса.

  • Тип honey-db - данные располагаются в указанной базе данных, управляются встроенным модулем.

Связи между объектами хранятся в виде отдельных сущностей, называемых Именованные связи или Линки.

Линки описываются в JSON (в будущем ещё и yaml) формате в файле с расширением link.

{
    "Name": "person_to_department",
    "DataSource": "person_storage",
    "From": "Person",
    "To": "Department"
}

В примере выше описывается именованная связь person_to_department, экземпляры которого хранятся в источнике данных person_storage. Линки person_to_department могут быть только между объектами, первый из которых обладает классом Person, а второй - Department.

Именованная связь всегда направлена от From-класса к To-классу. Классы могут совпадать. При необходимости сделать связь равнозначной (реверсной?) требуется создать новую связь, где значения From и To будут переставлены местами.

Источники данных по умолчанию не отвечают за целостность и консистентность данных. Для этих целей нужно использовать механизмы, которые придумаем и опишем позже.

Работа с данными

Миграции

Описать кратко про миграции классов и линков.

Распределённые транзакции

Описать про транзакции в процессах, про блокировки и обработку исключений

Запрос данных из нескольких источников данных

Описать, что источники данных должны уметь ходить в другие источники за данными. (Придумать и описать универсальный язык запросов)

Изменение данных

Подумать, есть ли какие нюансы и вписать сюда. Привести пример запросов на изменение данных

Пример

Ниже нужно будет описать пример с несколькими классами - Peron, User, Employee, возможно ContactPerson, а также классом Department и необходимыми связями user_to_department, employee_to_manager и прочими

К примеру, нам нужно описать модели людей, каким-либо образом использующихся в корпоративном портале. Для нам люди могут быть:

  • Персонами (Person) с персональными данными

  • Пользователями портала (User)

  • Контактными лицами для связи (ContactPerson)

  • Сотрудниками компании (Employee)

Опишем классы.

Code block

Person:

Name: Person
DataSource: PersonStorage
Properties:
 - Name: FullName
   Type: string
 - Name: Age
   Type: decimal
 - Name: Sex
   Type: @Sex  

User:

Name: User
DataSource: IdentityStorage
Properties:
 - Name: Login
   Type: string
 - Name: Email
   Type: string
 - Name: TwoFactorAuthType
   Type: @TwoFactorAuthType

ContactPerson

Name: ContactPerson
DataSource: PersonStorage
Properties:
 - Name: Email
   Type: string
 - Name: Mobile
   Type: string
 - Name: phone
   Type: string 

Employee

Name: Employee
DataSource: HrStorage
Properties:
 - Name: Position
   Type: string

Last updated