Проектирование активов: наследование и иерархия
Статья фокусируется на механизмах моделирования активов через наследование (is-a) и иерархию (has-a). Здесь объясняются различия между специализацией типов (например, Документ → Договор) и вложенными связями (например, База данных → Таблица → Колонка). Рассматриваются примеры использования, ограничения и рекомендации по проектированию. Цель статьи — разграничить понятия иерархии и наследования, объяснить их особенности и предложить рекомендации для эффективного использования. Описание слоев хранения данных см. в статье "Архитектура хранения данных: слои и метаданные".
Основные концепции
Наследование: от общего к частному
Наследование — механизм, при котором дочерние типы активов наследуют атрибуты и свойства родительских типов. Это позволяет создавать специализированные сущности на основе общих шаблонов.
Режим "Наследование" отображает:
Уникальные типы активов без повторений.
Порядок определяется связями "родитель → потомок" (отношение is-a).
Как строится:
Типы выстраиваются в цепочки специализации:
Каждый тип может иметь только одного родителя (однонаправленное наследование).
Пример: Таблица → Логическая таблица → Физическая таблица.
Цель:
Показать, как типы уточняют друг друга через наследование атрибутов.
Помогает проектировать классификации (например, категории документов).
Пример визуализации:
Таблица
├─ Логическая таблица
└─ Физическая таблица
└─ Таблица СУБД
Особенности:
Передача атрибутов:
Базовые атрибуты (например, ID, Название) наследуются автоматически.
Дополнительные атрибуты (например, Версия, Описание) могут быть выбраны пользователем.
Использование:
Моделирование отношений общее → частное.
Пример: Родительский тип: "Таблица" → Дочерний тип: "Логическая таблица" → Дочерний тип: "Физическая таблица"
Иерархия: часть и целое
Иерархия — структура, которая организует типы активов через отношение "часть-целое". Реализуется с помощью свойства "Вложенная связь".
Режим "Иерархия" отображает:
Типы активов могут повторяться, если они связаны с разными родителями через свойство "Вложенная связь".
Порядок определяется связями "часть-целое" (отношение has-a).
Как строится:
Типы отображаются в виде графа с возможными циклами и множественными связями.
Пример: Тип "Контрагент" связан с "Договор" и "Счет" → в иерархии "Контрагент" будет отображен дважды:
Договор
└─ Контрагент (как сторона договора)
Счет
└─ Контрагент (как плательщик)
Цель:
Показать структурные связи между типами (например, что Колонка — часть Таблиц).
Визуализировать, как типы используются в разных контекстах.
Пример визуализации:
База данных
├─ Схема
│ ├─ Таблица
│ │ ├─ Колонка
│ │ └─ Индекс
│ └─ Представление
└─ Пользователь
└─ Роль
Особенности:
Структурные связи:
Актив-родитель содержит дочерние активы как составные части.
Пример: Тип "Таблица" → Тип "Колонка" (вложенная связь).
Примечание
Иерархия типов активов может быть сложная и фактически является графом, а не деревом, т.к. одна вершина может иметь несколько родителей и несколько потомков, а также сам граф может иметь циклы (связь сама на себя и более сложные). Для преобразования и ацикличного отображения иерархии циклы разрываются, т.е. из цикла убирается одна связь.
Сравнение наследования и иерархии
Критерий |
Наследование |
Иерархия |
Цель |
Специализация типов |
Организация структуры данных |
Отношения |
Родитель → потомок |
Целое → часть |
Атрибуты |
Наследуются |
Не наследуются |
Пример |
Логическая таблица → Физическая таблица |
Таблица → Колонка |
Рекомендации по проектированию
Когда использовать наследование?
Если нужно создать специализированный тип на основе общего шаблона.
Пример: Базовый тип: Документ.
Дочерние типы: Договор, Акт, Счет.
Когда использовать иерархию?
Если нужно отразить физическую или логическую структуру данных.
Пример: База данных → Схема → Таблица → Колонка.
Практические выводы для пользователей
Когда смотреть в режим "Наследование":
Если нужно проверить, какие атрибуты унаследованы от родителя.
Для проектирования иерархий специализации (например, Документ → Договор).
Когда смотреть в режим "Иерархия":
Если нужно понять, где тип используется как часть других типов.
Для анализа структурных связей (например, Сервер → Диск → Файл).
Почему это важно:
Наследование влияет на атрибуты типов.
Иерархия влияет на контекст использования типов.
Как избежать путаницы?
В интерфейсе:
Добавить подписи к режимам:
"Наследование: что наследуется",
"Иерархия: где используется".
Использовать разные отображения для связей (например, "→" для наследования и "▷" для иерархии).
В документации:
Привести примеры с повторяющимися типами в иерархии (как в случае с "Контрагент").
Объяснить, что повторения в иерархии — это нормально, так как они отражают реальные связи.
Пример:
Если тип "Контрагент" связан с "Договором" и "Счетом" через вложенные связи, то в режиме "Иерархия" он будет отображен дважды:
Как часть "Договора" (участник сделки).
Как часть "Счета" (плательщик).
Это не ошибка, а особенность режима: он показывает все контексты, где тип используется как компонент. В режиме Наследование "Контрагент" будет показан только один раз — в своей цепочке специализации (например, "Контрагент" → "Юр. лицо" → "ИП").