Зачем в базах данных вводят новые типы связей (отношений)?

«Зачем в базах данных вводят новые типы связей (отношений)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Новые или специализированные типы связей вводят для более точного и эффективного отражения сложных бизнес-сущностей и их взаимосвязей в реляционной модели, которые плохо описываются классическими 1:1, 1:N, N:M.

Причины и примеры:

  1. Рекурсивные связи (Self-Referencing): Для моделирования иерархий (дерево сотрудников, категорий товаров).

    CREATE TABLE Employee (
        id INT PRIMARY KEY,
        name VARCHAR(100),
        manager_id INT REFERENCES Employee(id) -- Связь на себя
    );
  2. Полиморфные ассоциации: Когда одна сущность должна ссылаться на одну из нескольких возможных целевых сущностей. В чистом SQL реализуется через (target_type, target_id).

    // Пример в JPA/Hibernate с @Any
    @Entity
    public class Comment {
        @Id Long id;
        @Any
        @JoinColumn(name = "target_id")
        @AnyDiscriminator(DiscriminatorType.STRING)
        @AnyKeyJavaClass(Long.class)
        @Column(name = "target_type")
        private Object target; // Может быть Post, Article, User
    }
  3. Временные (Temporal) связи: Для хранения истории изменений связей (когда сотрудник переходил из отдела в отдел). Реализуются через таблицы с полями периода действия (valid_from, valid_to).

  4. Графовые связи: Для социальных сетей, рекомендательных систем. Специализированные БД (Neo4j) или расширения (PostgreSQL с ltree).

Цель: Упростить схему БД и запросы, повысить производительность и целостность данных, избегая избыточных джойнов или дублирования таблиц.