PlantUML для баз даних
PlantUML для баз даних
Вступ: Навіщо потрібен PlantUML?
Якщо ви працювали з ER-діаграмами у попередніх уроках, ви помітили, що візуалізація структури бази даних критично важлива. Але що, якщо вам потрібно:
- 📊 Складні ER-діаграми з десятками таблиць?
- 🔄 Автогенерація діаграм з коду?
- 📝 Версіонування діаграм у Git разом з кодом?
- 🎨 Професійна візуалізація для документації?
PlantUML - це рішення всіх цих проблем!
Порівняння підходів
draw.io, Lucidchart, Visio
✅ Інтуїтивно
✅ WYSIWYG
❌ Важко підтримувати версії
❌ Складно синхронізувати з кодом
❌ Неможливо автогенерувати
❌ Важко робити code review
Текстовий опис → SVG/PNG
✅ Версіонування в Git
✅ Code review діаграм
✅ Автогенерація з коду
✅ Консистентний стиль
✅ Швидке оновлення
⚠️ Потрібно вивчити синтаксис
Встановлення та налаштування
Використання на цьому сайті
На цьому сайті PlantUML вже інтегрований! Використовуйте компонент ::plant-uml:
::plant-uml
\`\`\`plantuml
@startuml
entity Student {
\*id : int
--
name : string
}
@enduml
\`\`\`
::
Локальна робота (опціонально)
Найпростіший спосіб для тестування:
Розширення:
- Встановіть: PlantUML Extension
- Встановіть Java (потрібно для PlantUML)
- Створіть файл
.pumlта натиснітьAlt+Dдля preview
Локальний PlantUML сервер:
docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
Тепер доступно на http://localhost:8080
Базовий синтаксис
Структура PlantUML файлу
Кожна діаграма починається з @startuml та закінчується @enduml:
@startuml
' Це коментар
' Тут ваша діаграма
@enduml
- Одинарна лінія:
' коментарабо// коментар - Багаторядковий:
/' коментар '/
ER-діаграми (Entity-Relationship)
Основний синтаксис
Пояснення синтаксису
entity "Назва таблиці" as псевдонім {
*ключове_поле : тип <<PK>> // Первинний ключ
*зовнішній_ключ : тип <<FK>> // Зовнішній ключ
-- // Розділювач
звичайне_поле : тип
}
*- обов'язкове поле (NOT NULL)<<PK>>- Primary Key<<FK>>- Foreign Key--- розділювач між ключами та звичайними полями
Типи зв'язків
| Синтаксис PlantUML | Кардинальність | Значення | Приклад |
|---|---|---|---|
||--|| | 1:1 | Один до одного | Країна ↔ Столиця |
||--o{ | 1:N | Один до багатьох | Автор → Книги |
}o--o{ | M:N | Багато до багатьох | Студенти ↔ Курси |
||..o{ | 1:N (опціонально) | Необов'язковий зв'язок | Клієнт → Замовлення |
Легенда символів:
||- точно один (обов'язковий)o{- нуль або багато (опціонально)|{- один або багато (обов'язково хоч один)
Приклад: E-commerce система
!theme cerulean-outline застосовує готову тему. Інші теми:sketchy- ескізний стильvibrant- яскраві кольориtoy- іграшковий стильmars- темна тема
Class Diagram (Діаграми класів для ORM)
Якщо ви використовуєте ORM (Entity Framework, Hibernate), діаграми класів ідеально відображають вашу модель:
Модифікатори доступу
| Символ | Модифікатор | C# | Java |
|---|---|---|---|
+ | Public | public | public |
- | Private | private | private |
# | Protected | protected | protected |
~ | Package/Internal | internal | package-private |
Component Diagram (Архітектура системи)
Використовуйте для відображення архітектури вашого застосунку:
Sequence Diagram (Діаграми послідовності)
Ідеально для документування бізнес-процесів та API flows:
Практичний кейс: Database Transaction
Deployment Diagram (Діаграма розгортання)
Показує фізичну інфраструктуру та розміщення компонентів:
Стилізація та кастомізація
Кольори та стилі
Підсвічування критичних елементів
Практичні приклади
Приклад 1: Університет (повна ER-модель)
Приклад 2: Бібліотека
Генерація PlantUML з бази даних
З SQL Server
PowerShell скрипт для генерації ER-діаграми:
# GetPlantUMLFromDatabase.ps1
$server = "localhost"
$database = "MyDatabase"
$query = @"
SELECT
t.name AS TableName,
c.name AS ColumnName,
ty.name AS DataType,
c.is_nullable AS IsNullable,
CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END AS IsPK,
CASE WHEN fk.parent_column_id IS NOT NULL THEN 1 ELSE 0 END AS IsFK
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id
LEFT JOIN (
SELECT ic.object_id, ic.column_id
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
LEFT JOIN sys.foreign_key_columns fk ON c.object_id = fk.parent_object_id AND c.column_id = fk.parent_column_id
ORDER BY t.name, c.column_id
"@
# Виконати запит та згенерувати PlantUML
# (код спрощено для прикладу)
З Entity Framework Core
C# код для генерації з DbContext:
using Microsoft.EntityFrameworkCore;
using System.Text;
public static class PlantUmlGenerator
{
public static string GenerateFromDbContext(DbContext context)
{
var sb = new StringBuilder();
sb.AppendLine("@startuml");
sb.AppendLine("!theme cerulean-outline");
sb.AppendLine();
var entityTypes = context.Model.GetEntityTypes();
foreach (var entityType in entityTypes)
{
sb.AppendLine($"entity \"{entityType.ClrType.Name}\" as {entityType.ClrType.Name.ToLower()} {{");
var properties = entityType.GetProperties();
foreach (var prop in properties)
{
var isPK = prop.IsPrimaryKey() ? " <<PK>>" : "";
var isFK = prop.IsForeignKey() ? " <<FK>>" : "";
var asterisk = !prop.IsNullable ? "*" : " ";
sb.AppendLine($" {asterisk}{prop.Name} : {prop.ClrType.Name}{isPK}{isFK}");
}
sb.AppendLine("}");
sb.AppendLine();
}
// Генерація зв'язків
foreach (var entityType in entityTypes)
{
var navigations = entityType.GetNavigations();
foreach (var nav in navigations)
{
if (nav.IsCollection)
{
sb.AppendLine($"{entityType.ClrType.Name.ToLower()} ||--o{{ {nav.TargetEntityType.ClrType.Name.ToLower()}");
}
}
}
sb.AppendLine("@enduml");
return sb.ToString();
}
}
Поради та best practices
entity "UserAuthenticationHistory" as uah {
...
}
user ||--o{ uah : "має історію"
package "User Management" {
entity User
entity Role
entity Permission
}
package "E-commerce" {
entity Product
entity Order
}
' === CORE ENTITIES ===
entity User { ... }
' === JUNCTION TABLES ===
entity UserRole { ... }
entity User {
password_hash : varbinary(128)
}
note right of User
Використовується bcrypt
з work factor = 12
end note
- Максимум 10-15 сутностей на одній діаграмі
- Розбивайте велику систему на модулі
- Створюйте окремі діаграми для різних bounded contexts
Експорт та інтеграція
Формати експорту
PlantUML підтримує:
- SVG - векторна графіка (рекомендовано для web)
- PNG - растрова графіка
- PDF - для документації
- LaTeX - для наукових робіт
- ASCII Art - текстове представлення
Інтеграція з Git
Додайте .puml файли у версіонування:
project/
├── docs/
│ ├── diagrams/
│ │ ├── database-er.puml
│ │ ├── architecture.puml
│ │ └── api-flow.puml
│ └── README.md
├── src/
└── .gitignore
CI/CD генерація діаграм
GitHub Actions приклад:
name: Generate Diagrams
on: [push]
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Generate PlantUML diagrams
uses: cloudbees/plantuml-github-action@master
with:
args: -v -tsvg docs/diagrams/*.puml
- name: Commit diagrams
run: |
git config user.name "GitHub Actions"
git add docs/diagrams/*.svg
git commit -m "Update diagrams" || true
git push
Ресурси та інструменти
Онлайн інструменти
- PlantUML Online: plantuml.com
- PlantText: planttext.com
- Gravizo: gravizo.com
Документація
- Офіційний сайт: plantuml.com
- Довідник з ER-діаграм: plantuml.com/ie-diagram
- Всі типи діаграм: plantuml.com/sitemap
Інтеграції
- VS Code: PlantUML Extension
- IntelliJ IDEA: PlantUML integration plugin
- Confluence: PlantUML macro
- GitLab: Підтримка
.pumlу markdown - Notion: Через PlantUML сервер
Завдання для практики
- Project (назва, опис, дата початку)
- Task (назва, опис, статус, пріоритет)
- User (ім'я, email, роль)
- Comment (текст, дата створення)
- Проєкт має багато задач
- Користувач може бути призначений на багато задач
- Задача може мати багато коментарів
- Користувач може писати багато коментарів
- Web API (.NET)
- PostgreSQL база даних
- Redis кеш
- RabbitMQ черга повідомлень
- S3 сховище файлів
Висновок
PlantUML - це потужний інструмент для:
✅ Документування структури БД
✅ Проектування нових систем
✅ Комунікації в команді
✅ Автоматизації генерації діаграм
✅ Підтримки документації в актуальному стані
Наступні кроки:
- Спробуйте створити ER-діаграму для вашого проєкту
- Інтегруйте PlantUML у вашу документацію
- Налаштуйте автогенерацію діаграм у CI/CD
- Поділіться досвідом з командою!