Ключи и ссылки

Содержание

Ключи

Содержание

Объекты и ключи

  • Каждому объекту нужен ключ
    • Часто — суррогатный
  • Уникальность ключей
    • В таблице
    • В иерархии объектов
    • В базе данных
    • В мире

Автоматическая генерация ключей

  • Автоматически генерируемое поле
    • create table Student(
          id not null generated always as identity,
          -- serial
          -- auto_increment
          ...
      );
      
  • Последовательности
    • create sequence StudentSeq minvalue 1 maxvalue 999
          start with 1 increment by 1;
      
    • insert into Students (id, ...)
          values (StudentSeq.nextval, ...);
      

Проблемы автомат. генерации

  • При создании объекта неизвестен ключ
    • Проблемы протоколирования
  • Как сохранить граф объектов?
  • Топологическая сортировка
    • Проблемы с циклами
    • Нельзя вставить много объектов оптом
  • Для тестирования требуется подключение к БД
  • Требуется генерация ключей на клиенте

Генерация ключей

  • UUID/GUID
    • Большой размер
  • Выборка из таблицы
    • select max(id) from Students;
      
    • Долго
    • Проблемы с транзакциями

Таблицы ключей

  • Создание
    • create table Keys(
          name varchar(30) not null,
          minKey int id not null
      );
      
  • Выборка
    • Отдельная транзакция
    • select minKey from Keys where name = 'Students';
      update Keys set minKey = minKey + 1
          where name = 'Students';
      
  • Много транзакций
    • Как избежать?

Пулы ключей

  • Получение набора ключей
    • Отдельная транзакция
    • select minKey from Keys where name = 'Students';
      update Keys set minKey = minKey + 100
          where name = 'Students';
      
  • Распределение ключей из набора
    • По пулу на поток
    • Когда кончатся — пополнить пул
      • Побочные транзакции

Ссылки

Содержание

Ссылки

  • Одиночные
    • Внешний ключ
  • Коллекции
    • Таблица связей
    • Множество
      • Простая: (fromId, toId)
    • Список
      • С порядком: (fromId, idx, toId)
    • Отображение
      • С дополнительным ключом
      • (fromId, keyId, toId)
      • (fromId, keyV, toId)

Загрузка ссылок

  • Как и когда загружать ссылки?
  • При загрузке объектов
    • Рискуем загрузить всю базу
  • Загружать идентификаторы
    • Запрос при каждом доступе
    • Необходимо кэширование
  • Ленивая загрузка
    • Непредсказуем момент запроса
    • Сложно объединять запросы

Объединение запросов

  • Запрос к базе — долгий процесс
    • Минимизация количества запросов
  • Возможные объединения
    • Объекты одного типа
      select * from Students where SId in (:Id1, :Id2, :Id3);
      
    • Ссылки одной коллекции
      select id from Students where GroupId = 'M34391';
      
    • Объекты со ссылками
      select * from Groups natural join Students
          where GroupName like 'M343%';
      

Пример

  • Компьютеры

Подклассы

  • Идентификация типа
    • Хранение информации о типе
  • Общие поля
    • Где хранить?
  • Дополнительные поля
    • Где хранить?
  • Ссылки на базовый класс
    • Как синхронизировать идентификаторы?

«Широкая» таблица

  • Представление
    • Столбец типа
    • Столбцы для каждого поля подклассов
  • Пример
    • create table Computer(
          id int not null,
          type varchar(20) not null,
          departmentId int not null references Department(id),
          power float,
          personId int references Person(id),
          dockId int references Dock(id),
          displayId references Displays(id)
      )
      

Характеристики

  • Преимущества
    • Простота управления ключами
    • Простота ссылок
    • Простота запросов
  • Недостатки
    • Большое количество столбцов
    • Отсутствие обязательных полей

Таблицы конкретных классов

Содержание

Таблицы конкретных классов

  • Представление
    • По таблице для каждого конкретного подкласса
    • Столбцы для всех полей подкласса
  • Пример
    • create table Notebook(
          id int not null,
          departmentId int not null references Department(id),
          personId int references Person(id),
          dockId int references Dock(id)
      )
      
    • create table Desktop(...)
      
    • create table Mainframe(...)
      

Характеристики

  • Преимущества
    • Скорость загрузки объектов одинакового типа
  • Недостатки
    • Внешние соединения при загрузке разнотипных объектов
    • Стратегия генерации ключей
    • Отсутствие целостности ссылок на базовые классы

Таблицы классов

  • Представление
    • По таблице для каждого (под)класса
    • Столбцы для всех полей подкласса, но не унаследованных

Пример таблиц классов

  • create table Computer(
        id int not null,
        type varchar(20) not null,
        departmentId int not null references Department(id)
    )
    
  • create table PC(
        id int not null references Computer(id),
        personId int not null references Person(id)
    )
    
  • create table Notebook(
        id int not null references PC(id),
        dockId int references Dock(id)
    )
    

Характеристики

  • Преимущества
    • Простота управления ключами
    • Поддержка ссылочной целостности
  • Недостатки
    • Соединения при загрузке однотипных объектов
    • Внешние соединения при загрузке разнотипных объектов

Динамичные структуры

Содержание

Объекты неизвестной структуры

  • Товары
    • Характеристики
  • Пациенты
    • Симптомы
    • Анализы
    • Диагнозы
  • Клиенты
    • Реквизиты
    • Доверенности
    • Гарантии

Модель сущность-атрибут-значение

  • Представление
    • Таблица атрибутов
    • Ассоциация значений
  • Какой тип имеет value?
    • Разные
    • Разные таблицы для разных типов
  • Требуются метаданные

Метаданные

  • Представление
    • Тип сущности
    • Типы атрибутов
    • Зависимости
    • Значения по умолчанию
    • Группы атрибутов

Литература

Содержание

Основная литература

  • Дейт К. Введение в системы баз данных (глава 26)
  • Фаулер М. Архитектура корпоративных программных приложений (главы 3, 13)