Перейти до вмісту

Технічне завдання: Редактор ER-моделей K2 ERP

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні

Редактор ER-моделей K2 ERP — модуль для графічного проєктування структури бази даних, опису сутностей, полів, звʼязків, індексів, обмежень, бізнес-метаданих і подальшого збереження моделі у форматі YAML. На основі YAML-опису різні генератори можуть створювати ORM-моделі, міграції, API-схеми, документацію та інші артефакти для різних мов програмування.

1. Мета розробки

Розробити в K2 ERP графічний редактор ER-моделей, який дозволяє:

  • створювати структуру бази даних у візуальному режимі;
  • описувати таблиці, поля, типи даних, звʼязки та обмеження;
  • задавати індекси, ключі, enum-и, довідники та технічні метадані;
  • зберігати модель у форматі YAML;
  • версіонувати зміни структури;
  • перевіряти модель на помилки;
  • використовувати YAML як єдине джерело правди для генерації ORM;
  • генерувати ORM-код для різних мов програмування через окремі генератори;
  • формувати документацію по структурі бази даних;
  • підтримувати командну роботу над моделями.

2. Основна концепція

Редактор не повинен бути привʼязаний до однієї мови програмування або одного ORM. Його задача — створити універсальний опис ER-моделі.

Графічний ER-редактор
        ↓
YAML-модель
        ↓
Генератори
        ↓
ORM / міграції / API / документація

Приклад цільової схеми:

K2 ER Editor

schema.yml

Python SQLAlchemy generator

models.py

schema.yml

TypeScript Prisma generator

schema.prisma

schema.yml

C# Entity Framework generator

DbContext + Entities

schema.yml

PHP Laravel generator

Eloquent Models + Migrations

3. Основні принципи

Принцип Опис
Model-first Спочатку створюється ER-модель, потім із неї генерується код.
YAML як source of truth YAML-файл є основним джерелом структури.
ORM-agnostic Модель не має бути жорстко привʼязана до конкретного ORM.
Графічне редагування Користувач працює з діаграмою, а не тільки з текстовим YAML.
Двостороння синхронізація Зміни на діаграмі оновлюють YAML, а зміни YAML оновлюють діаграму.
Валідація Перед збереженням модель перевіряється на помилки.
Версіонування Зміни ER-моделі мають зберігатися в історії.
Розширюваність Має бути можливість додавати нові генератори мов і ORM.

4. Основні користувачі

Роль Опис Основні дії
Архітектор Проєктує структуру даних. Створення моделей, сутностей, звʼязків, правил.
Backend-розробник Використовує YAML для генерації ORM. Перегляд, редагування, генерація коду.
Аналітик Описує бізнес-сутності та поля. Додавання описів, коментарів, бізнес-атрибутів.
DBA Перевіряє індекси, ключі, обмеження. Аналіз структури БД, performance-рекомендації.
DevOps Використовує YAML у CI/CD. Генерація міграцій, перевірка схем.
Адміністратор Налаштовує права, шаблони, генератори. Управління доступами та конфігурацією.

5. Функціональні блоки редактора

Редактор має складатися з таких частин:

  • графічне полотно ER-діаграми;
  • панель інструментів;
  • дерево моделі;
  • панель властивостей;
  • YAML-редактор;
  • валідатор моделі;
  • менеджер звʼязків;
  • менеджер enum-ів;
  • менеджер індексів;
  • менеджер версій;
  • генератор ORM;
  • перегляд згенерованого коду;
  • експорт та імпорт;
  • журнал змін.

6. Загальний вигляд інтерфейсу

Рекомендована структура екрана:

+--------------------------------------------------------------------------------+
| Верхня панель: Назва моделі | Save | Validate | Generate | Export | Settings   |
+----------------------+-----------------------------------------+---------------+
| Дерево моделі        | Графічне полотно ER-діаграми            | Властивості   |
|                      |                                         |               |
| - Entities           |  +-------------+       +-------------+  | Entity/Field  |
|   - Customer         |  | Customer    | 1   N | Order       |  | properties    |
|   - Order            |  |-------------|-------|-------------|  |               |
| - Enums              |  | id          |       | id          |  |               |
| - Relations          |  | name        |       | customer_id |  |               |
| - Indexes            |  +-------------+       +-------------+  |               |
+----------------------+-----------------------------------------+---------------+
| Нижня панель: Errors | Warnings | YAML | Generated Code | Migration Preview    |
+--------------------------------------------------------------------------------+

7. Графічне полотно ER-діаграми

7.1. Основні вимоги

Графічне полотно має дозволяти:

  • створювати сутності;
  • переміщувати сутності;
  • змінювати розміри блоків;
  • створювати звʼязки drag-and-drop;
  • групувати сутності по доменах;
  • масштабувати діаграму;
  • переміщувати полотно;
  • автоматично розкладати схему;
  • фільтрувати видимі сутності;
  • шукати сутності та поля;
  • підсвічувати залежності;
  • відкривати властивості сутності, поля або звʼязку.

7.2. Дії на полотні

Дія Опис
Подвійний клік по пустому місцю Створення нової сутності.
Подвійний клік по сутності Відкриття повної картки сутності.
Клік по полю Відкриття властивостей поля.
Drag від поля до іншої сутності Створення звʼязку.
Ctrl + колесо миші Масштабування.
Space + drag Переміщення полотна.
Delete Видалення вибраного елемента після підтвердження.
Ctrl + Z Скасування останньої дії.
Ctrl + Y Повтор дії.

7.3. Відображення сутності

Кожна сутність на діаграмі має відображатися як блок:

+-----------------------------+
| Customer                    |
|-----------------------------|
| PK id: uuid                 |
| name: string                |
| email: string unique        |
| created_at: datetime        |
|-----------------------------|
| indexes: 2                  |
| relations: 3                |
+-----------------------------+

7.4. Візуальні позначення

Позначення Значення
PK Primary key.
FK Foreign key.
UQ Unique constraint.
IDX Indexed field.
NN Not nullable.
DEF Default value.
RO Read-only field.
SYS System field.

8. Сутності

Сутність відповідає таблиці, колекції або ORM-класу.

8.1. Поля сутності

Поле Тип Обовʼязкове Опис
name string Так Технічна назва сутності.
table string Так Назва таблиці в БД.
label string Ні Людинозрозуміла назва.
description text Ні Опис призначення сутності.
module string Ні Модуль K2 ERP, до якого належить сутність.
schema string Ні Схема БД, наприклад public, sales, crm.
type enum Так table, view, dictionary, document, register, system.
fields list Так Список полів.
relations list Ні Список звʼязків.
indexes list Ні Індекси.
constraints list Ні Обмеження.
audit boolean Ні Чи вести історію змін.
soft_delete boolean Ні Чи використовувати мʼяке видалення.
timestamps boolean Ні Чи створювати created_at / updated_at.

8.2. Типи сутностей

Тип Опис Приклад
table Звичайна таблиця. customers, orders.
dictionary Довідник. currencies, countries, units.
document Документ ERP. sales_invoice, purchase_order.
register Регістр або журнал рухів. stock_movements, account_entries.
view Представлення. customer_balance_view.
system Системна таблиця. users, roles, audit_log.

9. Поля сутності

9.1. Основні властивості поля

Властивість Тип Обовʼязкова Опис
name string Так Технічна назва поля.
column string Ні Назва колонки в БД, якщо відрізняється від name.
label string Ні Назва для UI.
description text Ні Опис поля.
type enum Так Тип даних.
nullable boolean Так Чи може бути null.
primary_key boolean Ні Чи є поле первинним ключем.
unique boolean Ні Чи має бути унікальним.
indexed boolean Ні Чи створювати індекс.
default string / number / expression Ні Значення за замовчуванням.
length integer Ні Довжина для string.
precision integer Ні Точність для decimal.
scale integer Ні Кількість знаків після коми.
enum reference Ні Посилання на enum.
reference reference Ні Посилання на іншу сутність.
generated boolean Ні Чи генерується автоматично.
readonly boolean Ні Чи поле read-only.
system boolean Ні Чи поле системне.

9.2. Підтримувані типи даних

Тип Опис Приклад БД
uuid UUID-ідентифікатор. uuid
integer Ціле число. integer
bigint Велике ціле число. bigint
smallint Маленьке ціле число. smallint
decimal Точне десяткове число. numeric(12,2)
float Число з плаваючою точкою. double precision
boolean Логічне значення. boolean
string Рядок обмеженої довжини. varchar(255)
text Довгий текст. text
date Дата. date
datetime Дата та час. timestamp
time Час. time
json JSON-структура. json / jsonb
enum Перелік значень. varchar / enum
binary Бінарні дані. bytea / blob
money Грошове значення. numeric(15,2)
reference Посилання на іншу сутність. foreign key

9.3. Системні поля

Редактор має мати можливість автоматично додавати типові системні поля:

Поле Тип Опис
id uuid / bigint Первинний ключ.
created_at datetime Дата створення.
updated_at datetime Дата оновлення.
created_by reference Користувач, який створив запис.
updated_by reference Користувач, який оновив запис.
deleted_at datetime Дата мʼякого видалення.
deleted_by reference Користувач, який видалив запис.
version integer Версія запису для optimistic locking.

10. Звʼязки між сутностями

10.1. Типи звʼязків

Тип Опис Приклад
one_to_one Один запис відповідає одному запису. User → UserProfile.
one_to_many Один запис має багато дочірніх записів. Customer → Orders.
many_to_one Багато записів належать одному запису. Order → Customer.
many_to_many Багато до багатьох через проміжну таблицю. Users ↔ Roles.
self_reference Посилання сутності на саму себе. Category → Parent Category.

10.2. Властивості звʼязку

Поле Тип Обовʼязкове Опис
name string Так Назва звʼязку.
type enum Так Тип звʼязку.
from_entity string Так Початкова сутність.
from_field string Так Поле FK.
to_entity string Так Цільова сутність.
to_field string Так Зазвичай primary key.
required boolean Ні Чи звʼязок обовʼязковий.
on_delete enum Ні restrict, cascade, set_null, no_action.
on_update enum Ні restrict, cascade, set_null, no_action.
backref string Ні Назва зворотного звʼязку для ORM.
junction_entity string Ні Для many_to_many.
label string Ні Назва для UI.

10.3. Візуальне відображення звʼязків

На діаграмі потрібно показувати кардинальність:

Customer 1 ─────── N Order
Order    N ─────── 1 Product
User     N ─────── N Role

10.4. Правила створення звʼязку

При створенні звʼязку редактор має запропонувати:

  • тип звʼязку;
  • поле FK або створення нового FK-поля;
  • назву звʼязку;
  • назву backref;
  • поведінку при delete;
  • поведінку при update;
  • чи є звʼязок обовʼязковим;
  • чи створювати індекс на FK.

11. Індекси

11.1. Типи індексів

Тип Опис
normal Звичайний індекс.
unique Унікальний індекс.
composite Складений індекс по кількох полях.
fulltext Повнотекстовий індекс.
partial Частковий індекс з умовою.

11.2. Властивості індексу

Поле Тип Опис
name string Назва індексу.
fields list Список полів.
unique boolean Унікальність.
type enum normal, unique, fulltext, partial.
condition string Умова для partial index.
description text Опис призначення індексу.

12. Обмеження

Редактор має підтримувати такі обмеження:

Обмеження Опис
primary_key Первинний ключ.
foreign_key Зовнішній ключ.
unique Унікальність.
check Перевірка умови.
not_null Заборона null.
default Значення за замовчуванням.

Приклад check-constraint:

amount >= 0

Приклад YAML:

constraints:
  - name: chk_order_amount_positive
    type: check
    expression: "amount >= 0"

13. Enum-и

13.1. Призначення

Enum використовується для полів із фіксованим набором значень.

Приклад:

OrderStatus:
  - draft
  - confirmed
  - paid
  - cancelled

13.2. Властивості enum

Поле Тип Опис
name string Назва enum.
label string Людинозрозуміла назва.
description text Опис.
values list Значення.

13.3. Властивості значення enum

Поле Тип Опис
value string Технічне значення.
label string Назва для UI.
color string Колір для інтерфейсу.
order integer Порядок відображення.
deprecated boolean Чи значення застаріле.

14. YAML-формат моделі

14.1. Основні вимоги до YAML

YAML-файл має бути:

  • читабельним;
  • стабільним для git-diff;
  • структурованим;
  • незалежним від конкретного ORM;
  • придатним для автоматичної генерації коду;
  • валідованим через schema validator;
  • версіонованим.

14.2. Загальна структура YAML

version: 1

project:
  name: k2_erp
  label: K2 ERP
  description: Main K2 ERP data model

settings:
  default_schema: public
  default_id_type: uuid
  timestamps: true
  soft_delete: false
  naming_strategy: snake_case

modules:
  - name: crm
    label: CRM
  - name: sales
    label: Sales

enums: []

entities: []

14.3. Приклад повної YAML-моделі

version: 1

project:
  name: k2_erp
  label: K2 ERP
  description: Example ER model for K2 ERP

settings:
  default_schema: public
  default_id_type: uuid
  timestamps: true
  soft_delete: true
  naming_strategy: snake_case

modules:
  - name: crm
    label: CRM
  - name: sales
    label: Sales

enums:
  - name: OrderStatus
    label: Order status
    values:
      - value: draft
        label: Draft
        color: gray
        order: 10
      - value: confirmed
        label: Confirmed
        color: blue
        order: 20
      - value: paid
        label: Paid
        color: green
        order: 30
      - value: cancelled
        label: Cancelled
        color: red
        order: 40

entities:
  - name: Customer
    table: customers
    label: Customer
    module: crm
    type: table
    description: Customer master data
    audit: true
    timestamps: true
    soft_delete: true

    fields:
      - name: id
        type: uuid
        primary_key: true
        nullable: false
        generated: true

      - name: name
        type: string
        length: 255
        nullable: false
        label: Customer name

      - name: email
        type: string
        length: 255
        nullable: true
        unique: true
        indexed: true

      - name: phone
        type: string
        length: 50
        nullable: true

    indexes:
      - name: idx_customers_email
        fields:
          - email
        unique: true

  - name: Order
    table: orders
    label: Order
    module: sales
    type: document
    description: Customer sales order
    audit: true
    timestamps: true

    fields:
      - name: id
        type: uuid
        primary_key: true
        nullable: false
        generated: true

      - name: customer_id
        type: uuid
        nullable: false
        indexed: true
        reference:
          entity: Customer
          field: id

      - name: number
        type: string
        length: 50
        nullable: false
        unique: true

      - name: status
        type: enum
        enum: OrderStatus
        nullable: false
        default: draft

      - name: amount
        type: decimal
        precision: 12
        scale: 2
        nullable: false
        default: 0

    relations:
      - name: customer
        type: many_to_one
        from_field: customer_id
        to_entity: Customer
        to_field: id
        required: true
        on_delete: restrict
        on_update: cascade
        backref: orders

    indexes:
      - name: idx_orders_customer_id
        fields:
          - customer_id
        unique: false

    constraints:
      - name: chk_orders_amount_positive
        type: check
        expression: "amount >= 0"

15. Двостороння синхронізація Diagram ↔ YAML

Редактор має підтримувати два режими роботи:

Режим Опис
Diagram-first Користувач редагує графічну діаграму, YAML оновлюється автоматично.
YAML-first Користувач редагує YAML, діаграма перебудовується після валідації.

15.1. Правила синхронізації

1. Кожна зміна на діаграмі оновлює внутрішню модель.
2. Внутрішня модель серіалізується у YAML.
3. Якщо користувач редагує YAML, він спочатку проходить парсинг.
4. Якщо YAML валідний — оновлюється діаграма.
5. Якщо YAML невалідний — показується помилка з рядком і полем.

16. Валідація моделі

16.1. Обовʼязкові перевірки

Перевірка Тип Опис
Унікальність entity.name Error Не може бути двох сутностей з однаковою назвою.
Унікальність table Error Дві сутності не можуть мати одну таблицю, крім спеціальних випадків.
Унікальність field.name Error У сутності не може бути двох полів з однаковою назвою.
Primary key Error Кожна table/document/dictionary має мати primary key.
Валідність reference Error FK має посилатися на існуючу сутність і поле.
Валідність enum Error Поле enum має посилатися на існуючий enum.
Nullable FK Warning Якщо relation required=true, FK не має бути nullable.
Індекс для FK Warning FK-поля рекомендовано індексувати.
Назви snake_case Warning Якщо naming_strategy=snake_case, назви мають відповідати правилу.
Циклічні cascade-звʼязки Warning/Error Можуть створити проблеми при видаленні.

16.2. Рівні повідомлень

Рівень Опис Чи блокує збереження
Error Критична помилка. Так.
Warning Потенційна проблема. Ні.
Info Інформаційне повідомлення. Ні.

17. Генерація ORM

17.1. Основна ідея

Редактор ER-моделей не повинен напряму містити логіку всіх ORM. Він має формувати універсальний YAML, а генерація виконується окремими генераторами.

schema.yml
  ↓
generator-python-sqlalchemy
  ↓
SQLAlchemy models

schema.yml
  ↓
generator-typescript-prisma
  ↓
Prisma schema

schema.yml
  ↓
generator-csharp-ef
  ↓
Entity Framework models

schema.yml
  ↓
generator-php-laravel
  ↓
Laravel Eloquent models

17.2. Підтримувані генератори в MVP

Генератор Пріоритет Результат
Python SQLAlchemy Високий models.py, relationships, indexes.
TypeScript Prisma Високий schema.prisma.
SQL DDL Високий CREATE TABLE, indexes, constraints.
Markdown documentation Середній Документація структури БД.
C# Entity Framework Середній Entity classes, DbContext.
PHP Laravel Eloquent Низький Models, migrations.

17.3. Налаштування генерації

У редакторі має бути розділ Generators, де задається:

  • мова програмування;
  • ORM;
  • output path;
  • naming strategy;
  • чи генерувати міграції;
  • чи генерувати relationships;
  • чи генерувати validation schemas;
  • чи генерувати DTO;
  • чи перезаписувати файли;
  • чи використовувати partial classes / custom blocks.

Приклад YAML:

generators:
  - name: python_sqlalchemy
    enabled: true
    output: ./generated/python
    options:
      base_class: Base
      use_mapped_column: true
      generate_relationships: true
      generate_indexes: true

  - name: prisma
    enabled: true
    output: ./generated/prisma
    options:
      provider: postgresql
      relation_mode: foreignKeys

18. Генерація міграцій

18.1. Призначення

Редактор має вміти порівнювати дві версії YAML-моделі й формувати опис змін.

schema_v1.yml
    ↓ compare
schema_v2.yml
    ↓
migration plan

18.2. Типи змін

Зміна Приклад Рівень ризику
Додана таблиця Add Customer. Low.
Додано nullable-поле Add phone. Low.
Додано not null поле без default Add amount not null. High.
Видалено поле Drop email. High.
Змінено тип поля string → integer. High.
Додано індекс Add idx_customer_email. Medium.
Видалено таблицю Drop orders. Critical.

18.3. Migration preview

Редактор має показувати попередній перегляд:

+ Add table customers
+ Add field customers.email
+ Add index idx_customers_email
! Change field orders.amount decimal(10,2) → decimal(12,2)
- Drop field customers.old_code

Для ризикових змін потрібно показувати попередження.

19. Версіонування моделей

19.1. Вимоги

Система має підтримувати:

  • історію версій;
  • порівняння версій;
  • rollback до попередньої версії;
  • коментар до версії;
  • автора зміни;
  • дату зміни;
  • статус версії.

19.2. Статуси версії

Статус Опис
draft Чернетка.
review Очікує перегляду.
approved Затверджено.
released Використовується для генерації production-коду.
archived Архівна версія.

20. Робота з модулями K2 ERP

Редактор має підтримувати розбиття моделі на модулі.

Приклад модулів:

  • core;
  • crm;
  • sales;
  • purchases;
  • warehouse;
  • finance;
  • hr;
  • affiliate;
  • integrations.

Кожна сутність має мати поле `module`.

Приклад:

entities:
  - name: Customer
    table: customers
    module: crm

У UI має бути фільтр за модулями.

21. Пошук і навігація

Редактор має підтримувати:

  • пошук сутності за назвою;
  • пошук поля;
  • пошук таблиці;
  • пошук enum;
  • пошук звʼязків;
  • фільтр за модулем;
  • фільтр за типом сутності;
  • фільтр за помилками валідації;
  • перехід від поля FK до повʼязаної сутності;
  • підсвічування усіх звʼязків вибраної сутності.

22. Імпорт

22.1. Джерела імпорту

Редактор має підтримувати імпорт із:

  • YAML;
  • JSON;
  • SQL DDL;
  • існуючої БД через introspection;
  • CSV-опису таблиць;
  • Mermaid ER diagram;
  • PlantUML ER diagram.

22.2. MVP імпорту

Для MVP достатньо:

  • імпорт YAML;
  • імпорт із існуючої PostgreSQL БД;
  • імпорт SQL DDL у базовому режимі.

23. Експорт

Редактор має підтримувати експорт у:

  • YAML;
  • JSON;
  • SQL DDL;
  • PNG/SVG діаграми;
  • PDF документацію;
  • Markdown документацію;
  • Mermaid ER diagram;
  • PlantUML.

24. Права доступу

Дія Архітектор Розробник Аналітик DBA Адміністратор Перегляд
Перегляд моделі Так Так Так Так Так Так
Створення сутностей Так Так Ні Так Так Ні
Редагування полів Так Так Частково Так Так Ні
Редагування описів Так Так Так Так Так Ні
Видалення сутностей Так Ні Ні Так Так Ні
Затвердження версії Так Ні Ні Так Так Ні
Генерація ORM Так Так Ні Так Так Ні
Налаштування генераторів Так Ні Ні Ні Так Ні

25. Audit log

Потрібно зберігати історію змін.

25.1. Що логувати

  • створення сутності;
  • видалення сутності;
  • перейменування сутності;
  • додавання поля;
  • видалення поля;
  • зміну типу поля;
  • зміну nullable;
  • зміну primary key;
  • створення звʼязку;
  • видалення звʼязку;
  • зміну індексу;
  • зміну enum;
  • імпорт;
  • експорт;
  • генерацію ORM;
  • затвердження версії.

25.2. Поля audit log

Поле Опис
user Користувач, який зробив зміну.
action Тип дії.
object_type Entity, Field, Relation, Enum, Index, Model.
object_name Назва обʼєкта.
old_value Старе значення.
new_value Нове значення.
created_at Дата зміни.
comment Коментар користувача.

26. Undo / Redo

Редактор має підтримувати:

  • скасування останньої дії;
  • повтор скасованої дії;
  • історію дій у межах поточної сесії;
  • підтвердження для небезпечних дій.

Приклади дій, які мають підтримувати undo:

  • створення сутності;
  • переміщення сутності;
  • додавання поля;
  • зміна поля;
  • створення звʼязку;
  • видалення звʼязку;
  • зміна YAML.

27. Collaboration

У майбутніх версіях бажано підтримати командну роботу.

27.1. MVP

Для MVP достатньо:

  • блокування моделі при редагуванні;
  • показ користувача, який редагує модель;
  • ручне збереження версій;
  • коментар до збереження.

27.2. Наступні версії

  • live collaboration;
  • коментарі на сутностях;
  • review workflow;
  • approval process;
  • conflict resolution;
  • merge моделей.

28. Налаштування naming strategy

Редактор має підтримувати правила іменування.

Параметр Опис Приклад
entity_case Формат назв сутностей. PascalCase: CustomerOrder.
table_case Формат назв таблиць. snake_case: customer_orders.
field_case Формат назв полів. snake_case: customer_id.
enum_case Формат enum. PascalCase: OrderStatus.
index_prefix Префікс індексів. idx_.
fk_prefix Префікс foreign key. fk_.

Приклад YAML:

naming:
  entity_case: PascalCase
  table_case: snake_case
  field_case: snake_case
  enum_case: PascalCase
  index_prefix: idx_
  foreign_key_prefix: fk_

29. UI для редагування сутності

Картка сутності має містити вкладки:

  • General;
  • Fields;
  • Relations;
  • Indexes;
  • Constraints;
  • ORM;
  • UI metadata;
  • Audit;
  • YAML Preview.

29.1. General

Поля:

  • name;
  • table;
  • label;
  • module;
  • schema;
  • type;
  • description;
  • audit;
  • timestamps;
  • soft_delete.

29.2. Fields

Функції:

  • додати поле;
  • редагувати поле;
  • видалити поле;
  • змінити порядок;
  • позначити primary key;
  • позначити unique;
  • позначити indexed;
  • зробити nullable / not nullable;
  • вибрати enum;
  • вибрати reference.

29.3. Relations

Функції:

  • створити звʼязок;
  • редагувати звʼязок;
  • видалити звʼязок;
  • перейти до повʼязаної сутності;
  • автоматично створити FK-поле.

29.4. Indexes

Функції:

  • створити індекс;
  • обрати поля;
  • задати unique;
  • задати тип індексу;
  • задати condition.

29.5. ORM

Має містити ORM-специфічні налаштування, але вони не повинні ламати універсальність YAML.

Приклад:

orm:
  python_sqlalchemy:
    class_name: Customer
    table_args: []
  prisma:
    model_name: Customer
  django:
    app_label: crm

30. UI metadata

Редактор має дозволяти задавати метадані для автоматичної генерації UI.

30.1. Метадані сутності

Поле Опис
list_view Які поля показувати в списку.
form_view Які поля показувати у формі.
search_fields Поля для пошуку.
display_field Головне поле для відображення.
icon Іконка сутності.
color Колір модуля або сутності.

Приклад:

ui:
  display_field: name
  list_view:
    - name
    - email
    - phone
  search_fields:
    - name
    - email
    - phone
  icon: user

31. API редактора

Редактор має мати API для інтеграції з іншими частинами K2 ERP.

31.1. Основні endpoint-и

Метод Endpoint Опис
GET /api/er-models Список моделей.
POST /api/er-models Створити модель.
GET /api/er-models/{id} Отримати модель.
PUT /api/er-models/{id} Оновити модель.
POST /api/er-models/{id}/validate Провалідувати модель.
POST /api/er-models/{id}/generate Запустити генерацію.
GET /api/er-models/{id}/versions Отримати версії.
POST /api/er-models/{id}/export Експорт моделі.
POST /api/er-models/import Імпорт моделі.

32. Зберігання моделей у K2 ERP

32.1. Сутність er_models

Поле Тип Опис
id uuid ID моделі.
name string Назва моделі.
label string Людинозрозуміла назва.
description text Опис.
current_version_id uuid Поточна версія.
status enum draft, review, approved, released, archived.
created_by reference Автор.
created_at datetime Дата створення.
updated_at datetime Дата оновлення.

32.2. Сутність er_model_versions

Поле Тип Опис
id uuid ID версії.
model_id uuid Посилання на модель.
version string Номер версії.
yaml_content text YAML-модель.
checksum string Хеш YAML.
status enum draft, review, approved, released, archived.
comment text Коментар до версії.
created_by reference Автор.
created_at datetime Дата створення.

33. Нефункціональні вимоги

33.1. Продуктивність

Редактор має підтримувати:

  • до 500 сутностей в одній моделі;
  • до 10 000 полів у моделі;
  • до 2 000 звʼязків;
  • відкриття моделі до 100 сутностей — до 3 секунд;
  • відкриття моделі до 500 сутностей — до 10 секунд;
  • валідація моделі до 500 сутностей — до 5 секунд;
  • генерація YAML — до 3 секунд;
  • генерація ORM — залежно від генератора, але з прогресом виконання.

33.2. Надійність

Система має:

  • не втрачати зміни при оновленні сторінки, якщо є autosave;
  • показувати конфлікти при одночасному редагуванні;
  • не дозволяти зберегти невалідну модель як released;
  • мати резервне збереження draft-версії;
  • вести audit log.

33.3. Безпека

Потрібно:

  • перевіряти права доступу;
  • обмежувати генерацію коду тільки авторизованим користувачам;
  • не дозволяти виконання довільного коду з YAML;
  • перевіряти YAML на небезпечні конструкції;
  • логувати імпорт та експорт моделей.

34. MVP

34.1. Що включити в MVP

1. Створення ER-моделі.
2. Графічне створення сутностей.
3. Додавання полів.
4. Створення one_to_many / many_to_one звʼязків.
5. Primary key, foreign key, unique, nullable.
6. Enum-и.
7. Індекси.
8. YAML export/import.
9. Валідація моделі.
10. Збереження версій.
11. Генерація SQL DDL.
12. Генерація Python SQLAlchemy.
13. Перегляд YAML поруч із діаграмою.
14. Базовий audit log.

34.2. Що можна відкласти

1. Live collaboration.
2. Merge конфліктів.
3. Складні міграції.
4. Імпорт із Mermaid / PlantUML.
5. Генерація для всіх ORM.
6. Коментарі на діаграмі.
7. AI-рекомендації по структурі.
8. Автоматична оптимізація індексів.
9. Повний reverse engineering складних БД.

35. Критерії приймання

35.1. Створення моделі

1. Користувач може створити нову ER-модель.
2. Користувач може задати назву, опис і модуль.
3. Модель зберігається в K2 ERP.
4. Для моделі створюється перша draft-версія.

35.2. Робота з сутностями

1. Користувач може створити сутність на діаграмі.
2. Користувач може задати назву таблиці.
3. Користувач може додати поля.
4. Користувач може задати primary key.
5. Користувач може видалити сутність після підтвердження.

35.3. Робота з полями

1. Користувач може додати поле.
2. Користувач може вибрати тип даних.
3. Користувач може задати nullable.
4. Користувач може задати default.
5. Користувач може задати unique та index.

35.4. Робота зі звʼязками

1. Користувач може створити звʼязок між двома сутностями.
2. Система може автоматично створити FK-поле.
3. На діаграмі показується кардинальність.
4. Звʼязок зберігається в YAML.
5. При видаленні сутності система попереджає про залежні звʼязки.

35.5. YAML

1. Діаграма експортується у валідний YAML.
2. YAML можна імпортувати назад.
3. Після імпорту відновлюються сутності, поля, enum-и та звʼязки.
4. Помилки YAML показуються користувачу.

35.6. Валідація

1. Система знаходить дублікати назв сутностей.
2. Система знаходить дублікати полів.
3. Система знаходить невалідні FK.
4. Система попереджає про FK без індексу.
5. Невалідну модель не можна перевести в released.

35.7. Генерація

1. Користувач може згенерувати SQL DDL.
2. Користувач може згенерувати Python SQLAlchemy-моделі.
3. Згенерований код можна переглянути перед завантаженням.
4. Генерація виконується з YAML-моделі.
5. Помилки генерації показуються користувачу.

36. Приклад сценарію роботи користувача

1. Архітектор створює модель “K2 Sales Model”.
2. Додає модулі crm і sales.
3. Створює сутність Customer.
4. Додає поля id, name, email, phone.
5. Створює сутність Order.
6. Додає поля id, customer_id, number, status, amount.
7. Створює enum OrderStatus.
8. Створює звʼязок Customer 1 → N Order.
9. Запускає валідацію.
10. Виправляє warnings.
11. Зберігає версію 0.1.0.
12. Генерує YAML.
13. Генерує SQLAlchemy-моделі.
14. Передає YAML у репозиторій.
15. CI/CD генерує ORM та міграції.

37. Ризики

Ризик Наслідок Як зменшити
YAML стане занадто ORM-специфічним Втрата універсальності. Розділяти core schema та orm-specific extensions.
Користувачі зламають модель через YAML-редактор Неможливо згенерувати код. Обовʼязкова валідація перед збереженням.
Великі моделі будуть повільно відкриватися Поганий UX. Lazy loading, фільтри модулів, canvas virtualization.
Генератори різних мов працюватимуть по-різному Розбіжності в ORM. Єдиний контракт YAML і тестові fixtures.
Видалення поля призведе до втрати даних Ризик production-інциденту. Migration preview і high-risk warnings.

38. Рекомендований план реалізації

38.1. Етап 1. Аналітика

1. Узгодити YAML-схему.
2. Узгодити набір типів даних.
3. Узгодити правила naming strategy.
4. Узгодити MVP-генератори.
5. Узгодити правила валідації.

38.2. Етап 2. Базовий редактор

1. Реалізувати створення моделі.
2. Реалізувати графічне полотно.
3. Реалізувати створення сутностей.
4. Реалізувати додавання полів.
5. Реалізувати панель властивостей.

38.3. Етап 3. Звʼязки та enum-и

1. Реалізувати FK-звʼязки.
2. Реалізувати відображення кардинальності.
3. Реалізувати enum-и.
4. Реалізувати індекси.

38.4. Етап 4. YAML

1. Реалізувати export YAML.
2. Реалізувати import YAML.
3. Реалізувати YAML preview.
4. Реалізувати YAML editor.
5. Реалізувати синхронізацію diagram ↔ YAML.

38.5. Етап 5. Валідація

1. Перевірка унікальності сутностей.
2. Перевірка полів.
3. Перевірка FK.
4. Перевірка enum.
5. Перевірка індексів.

38.6. Етап 6. Генерація

1. Генерація SQL DDL.
2. Генерація Python SQLAlchemy.
3. Перегляд результату.
4. Завантаження результату.
5. Обробка помилок генерації.

38.7. Етап 7. Версіонування та audit

1. Збереження версій.
2. Порівняння версій.
3. Audit log.
4. Статуси draft/review/approved/released.

39. Висновок

Редактор ER-моделей K2 ERP має стати центральним інструментом для проєктування структури даних. Його основна цінність — відокремити опис бізнес-моделі та структури БД від конкретної мови програмування або ORM.

Ключові вимоги:

  • графічне редагування ER-діаграми;
  • повний опис сутностей, полів, звʼязків, enum-ів, індексів і constraints;
  • збереження моделі у YAML;
  • двостороння синхронізація Diagram ↔ YAML;
  • валідація перед збереженням і генерацією;
  • генерація ORM через окремі генератори;
  • підтримка версій, audit log і migration preview;
  • розширюваність під різні мови програмування.

Для MVP достатньо реалізувати створення сутностей, полів, звʼязків, enum-ів, YAML import/export, базову валідацію, SQL DDL generator і Python SQLAlchemy generator.