3. Запросы из внешних систем / 3.1. Описание базового примера
3. Запросы из внешних систем / 3.1. Описание базового примера

3.1. Описание базового примера

3.1. Описание базового примера

Рассматриваемый далее пример использует простую модель данных библиотеки. Имеются объекты следующих типов:

  • Пользователь (User) со следующими полями:
    • id
    • username
  • Книга (Book) со следующими полями:
    • id
    • book_name
    • author
  • Подписка/Абонемент (Subscription) со следующими полями:
    • id
    • user_id
    • book_id

Все объекты в примере имеют логический тип Агрегат («Aggregate» — см. подробнее). При этом объекты Пользователь и Книга связаны с объектом Подписка (в объекте Подписка хранится информация о том, какие книги есть у каких пользователей).

skinparam monochrome true
hide empty members

class User <Aggregate> << (U,white) >> {
.. fields ..
+ id
+ username
.. indexes ..
# id
}

abstract class Book <Aggregate> << (B,white) >> {
.. fields ..
+ id
+ book_name
+ author
.. indexes ..
# id
}

abstract class Subscription <Aggregate> << (S,gray) >> {
.. fields ..
+ id
+ user_id
+ book_id
.. indexes ..
# pkey [id, user_id]
# user_id
# book_id
}

User "1" *-- "n" Subscription
Book "1" *-- "n" Subscription

На языке доменной модели (используемом в TDG) описание этой структуры выглядит следующим образом:

[
    {
        "name": "User",
        "type": "record",
        "logicalType": "Aggregate",
        "doc": "читатель",
        "fields": [
            {"name": "id", "type": "long"},
            {"name": "username", "type": "string"}
        ],
        "indexes": ["id"],
        "relations": [
          { "name": "subscription", "to": "Subscription", "count": "many", "from_fields": "id", "to_fields": "user_id" }
        ]
    },
    {
        "name": "Book",
        "type": "record",
        "logicalType": "Aggregate",
        "doc": "книга",
        "fields": [
            {"name": "id", "type": "long"},
            {"name": "book_name", "type": "string"},
            {"name": "author", "type": "string"}
        ],
        "indexes": ["id"],
        "relations": [
          { "name": "subscription", "to": "Subscription", "count": "many", "from_fields": "id", "to_fields": "book_id" }
        ]
    },
    {
    "name": "Subscription",
    "type": "record",
    "logicalType": "Aggregate",
    "doc": "абонемент",
    "fields": [
        {"name": "id", "type": "long"},
        {"name": "user_id", "type": "long"},
        {"name": "book_id", "type": "long"}
    ],
    "indexes": [
      {"name":"pkey", "parts": ["id", "user_id"]},
      "user_id",
      "book_id"
    ],
    "affinity": "user_id",
    "relations": [
      { "name": "user", "to": "User", "count": "one", "from_fields": "user_id", "to_fields": "id" },
      { "name": "book", "to": "Book", "count": "one", "from_fields": "book_id", "to_fields": "id" }
    ]
    }
]

Примечание

Параметр affinity не используется в данном разделе по назначению и достался базовому примеру из пятого упражнения Getting started для TDG. Подробнее про параметр affinity читайте в документации.

3.1.1. Подготовка TDG

Для работы с примерами запросов вам потребуется рабочий кластер TDG с загруженной конфигурацией системы и моделью данных.

  1. Выполните установку и настройку кластера TDG в соответствии с инструкциями Установка и запуск и Настройка кластера.
  2. Скачайте архив с конфигурацией, содержащий модель данных и конфигурацию системы, и загрузите в TDG согласно инструкции.

В результате у вас должен получиться кластер TDG с полноценным набором ролей: connector, input_processor, storage, account_manager, logger и другие. При этом вышеуказанный архив с конфигурацией содержит рассмотренную ранее модель данных, включающую три агрегата User, Book и Subscription со связями между ними. Кроме модели данных в архиве содержится файл конфигурации системы и файлы с исходными кодами функций обработки данных.