Проектирование активов: наследование и иерархия

Статья фокусируется на механизмах моделирования активов через наследование (is-a) и иерархию (has-a). Здесь объясняются различия между специализацией типов (например, Документ → Договор) и вложенными связями (например, База данных → Таблица → Колонка). Рассматриваются примеры использования, ограничения и рекомендации по проектированию. Цель статьи — разграничить понятия иерархии и наследования, объяснить их особенности и предложить рекомендации для эффективного использования. Описание слоев хранения данных см. в статье "Архитектура хранения данных: слои и метаданные".

Основные концепции

Наследование: от общего к частному

Наследование — механизм, при котором дочерние типы активов наследуют атрибуты и свойства родительских типов. Это позволяет создавать специализированные сущности на основе общих шаблонов.

  • Режим "Наследование" отображает:

    • Уникальные типы активов без повторений.

    • Порядок определяется связями "родитель → потомок" (отношение is-a).

  • Как строится:

    • Типы выстраиваются в цепочки специализации:

      • Каждый тип может иметь только одного родителя (однонаправленное наследование).

      • Пример: Таблица → Логическая таблица → Физическая таблица.

  • Цель:

    • Показать, как типы уточняют друг друга через наследование атрибутов.

    • Помогает проектировать классификации (например, категории документов).

  • Пример визуализации:

Таблица
├─ Логическая таблица
└─ Физическая таблица
    └─ Таблица СУБД

Особенности:

  • Передача атрибутов:

    • Базовые атрибуты (например, ID, Название) наследуются автоматически.

    • Дополнительные атрибуты (например, Версия, Описание) могут быть выбраны пользователем.

  • Использование:

    • Моделирование отношений общее → частное.

    • Пример: Родительский тип: "Таблица" → Дочерний тип: "Логическая таблица" → Дочерний тип: "Физическая таблица"

Иерархия: часть и целое

Иерархия — структура, которая организует типы активов через отношение "часть-целое". Реализуется с помощью свойства "Вложенная связь".

  • Режим "Иерархия" отображает:

    • Типы активов могут повторяться, если они связаны с разными родителями через свойство "Вложенная связь".

    • Порядок определяется связями "часть-целое" (отношение has-a).

  • Как строится:

    • Типы отображаются в виде графа с возможными циклами и множественными связями.

    • Пример: Тип "Контрагент" связан с "Договор" и "Счет" → в иерархии "Контрагент" будет отображен дважды:

Договор
└─ Контрагент (как сторона договора)
Счет
└─ Контрагент (как плательщик)
  • Цель:

    • Показать структурные связи между типами (например, что Колонка — часть Таблиц).

    • Визуализировать, как типы используются в разных контекстах.

  • Пример визуализации:

База данных
├─ Схема
│   ├─ Таблица
│   │   ├─ Колонка
│   │   └─ Индекс
│   └─ Представление
└─ Пользователь
    └─ Роль

Особенности:

  • Структурные связи:

    • Актив-родитель содержит дочерние активы как составные части.

    • Пример: Тип "Таблица" → Тип "Колонка" (вложенная связь).

Примечание

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

Сравнение наследования и иерархии

Критерий

Наследование

Иерархия

Цель

Специализация типов

Организация структуры данных

Отношения

Родитель → потомок

Целое → часть

Атрибуты

Наследуются

Не наследуются

Пример

Логическая таблица → Физическая таблица

Таблица → Колонка

Рекомендации по проектированию

Когда использовать наследование?

  • Если нужно создать специализированный тип на основе общего шаблона.

  • Пример: Базовый тип: Документ.

    • Дочерние типы: Договор, Акт, Счет.

Когда использовать иерархию?

  • Если нужно отразить физическую или логическую структуру данных.

  • Пример: База данных → Схема → Таблица → Колонка.

Практические выводы для пользователей

  1. Когда смотреть в режим "Наследование":

    • Если нужно проверить, какие атрибуты унаследованы от родителя.

    • Для проектирования иерархий специализации (например, Документ → Договор).

  2. Когда смотреть в режим "Иерархия":

    • Если нужно понять, где тип используется как часть других типов.

    • Для анализа структурных связей (например, Сервер → Диск → Файл).

  3. Почему это важно:

    • Наследование влияет на атрибуты типов.

    • Иерархия влияет на контекст использования типов.

Как избежать путаницы?

  • В интерфейсе:

    • Добавить подписи к режимам:

      • "Наследование: что наследуется",

      • "Иерархия: где используется".

    • Использовать разные отображения для связей (например, "→" для наследования и "▷" для иерархии).

  • В документации:

    • Привести примеры с повторяющимися типами в иерархии (как в случае с "Контрагент").

    • Объяснить, что повторения в иерархии — это нормально, так как они отражают реальные связи.

Пример:

Если тип "Контрагент" связан с "Договором" и "Счетом" через вложенные связи, то в режиме "Иерархия" он будет отображен дважды:

  • Как часть "Договора" (участник сделки).

  • Как часть "Счета" (плательщик).

Это не ошибка, а особенность режима: он показывает все контексты, где тип используется как компонент. В режиме Наследование "Контрагент" будет показан только один раз — в своей цепочке специализации (например, "Контрагент""Юр. лицо""ИП").