cерьезные отношения: паттерны проектирования...

69
30 октября 2014 года Серьёзные отношения: паттерны проектирования реляционных СУБД Максим Зинченко Oracle/Java разработчик

Upload: custis

Post on 30-Jun-2015

136 views

Category:

Software


3 download

DESCRIPTION

Открытый семинар для студентов в компании CUSTIS (30 октября 2014 года). Лектор: Максим Зинченко, ведущий разработчик Java/Oracle. Из этого семинара вы узнаете об основных проблемах и возможностях применения паттернов в проектировании сложных реляционных БД. Видеозапись семинара: https://vimeo.com/111013795.

TRANSCRIPT

Page 1: Cерьезные отношения: паттерны проектирования реляционных БД

30 октября 2014 года

Серьёзные отношения:

паттерны проектирования

реляционных СУБД

Максим Зинченко

Oracle/Java разработчик

Page 2: Cерьезные отношения: паттерны проектирования реляционных БД

Кто я? Что я здесь делаю?

Окончил МИФИ

В IT работаю 13 лет

Программирую – 20 лет

Работаю в CUSTIS 5 лет

Oracle => Java

2/69

Page 3: Cерьезные отношения: паттерны проектирования реляционных БД

План

Вводная

Паттерны?

Парадигмы

Паттерны для СУБД: что это?

Отношения объектов

Отношения классов

Перекус

Практика

Скучная

часть

Веселье

3/69

Page 4: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны

для проектирования СУБД

4/69

Page 5: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны?

Что такое шаблоны проектирования?

Стандартные решения типовых задач

Зачем нужны?

Передача опыта

Упрощение коммуникаций

5/69

Page 6: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Императивная (структурная, ООП, …)

Делай, что сказано!

6/69

Page 7: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Императивная (структурная, ООП, …)

Декларативная

7/69

Page 8: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Императивная (структурная, ООП, …)

Декларативная

Функциональная

8/69

Page 9: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Стандартный язык для СУБД – SQL

SQL состоит из двух основных частей

Описание структур (DDL)

Описание запросов (DML)

Обе части декларативные

9/69

Page 10: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

В приложении часто сочетаются

разные парадигмы

Императивная часть Декларативная часть

10/69

Page 11: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Использование разных парадигм

В основном эти части пересекаются

в сущностях и их отношениях

11/69

Page 12: Cерьезные отношения: паттерны проектирования реляционных БД

Парадигмы программирования

Обычно императивной части уделяют больше

внимания

DDD

12/69

Page 13: Cерьезные отношения: паттерны проектирования реляционных БД

План

Вводная

Паттерны?

Парадигмы

Паттерны для СУБД: что это?

Отношения объектов

Отношения классов

Перекус

Практика

Мы здесь

13/69

Page 14: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны проектирования

В основном проработаны

для императивных языков (особенно ООП)

Нам не интересны поведенческие,

только структурные

Почти все они есть в UML

Такие паттерны можно реализовать

и в декларативной части

14/69

Page 15: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны проектирования

Из модели должна следовать реализация

во всех частях программы

Будем считать паттернами СУБД

адаптацию структурных паттернов,

используемых в модели,

к реляционной структуре

15/69

Page 16: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны отношений объектов

Вводная

Паттерны?

Парадигмы

Паттерны для СУБД: что это?

Отношения объектов

Отношения классов

Перекус

Практика

Мы здесь

16/69

Page 17: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны отношений объектов

Отношения объектов разных классов

Отношения объектов одного класса

17/69

Page 18: Cерьезные отношения: паттерны проектирования реляционных БД

18/69

Page 19: Cерьезные отношения: паттерны проектирования реляционных БД

Отношения объектов разных классов

Отношения между экземплярами

По UML:

Ассоциации

Агрегации

Композиции

19/69

Page 20: Cерьезные отношения: паттерны проектирования реляционных БД

Схема для примеров

20/69

Page 21: Cерьезные отношения: паттерны проектирования реляционных БД

Ассоциации

«Союз равных»

Реализация сильно зависит от кратности

21/69

Page 22: Cерьезные отношения: паттерны проектирования реляционных БД

Один ко многим (1:N)

Классический вариант – FOREIGN KEY

22/69

Page 23: Cерьезные отношения: паттерны проектирования реляционных БД

Один ко многим (1:N)

Классический вариант – FOREIGN KEY

Мягкая ссылка

Часто делается отключенный FK

23/69

Page 24: Cерьезные отношения: паттерны проектирования реляционных БД

Один к одному (1:1)

Сводим к 1:N

24/69

Page 25: Cерьезные отношения: паттерны проектирования реляционных БД

Один к одному (1:1)

Сводим к 1:N

Единый ключ (PRIMARY KEY)

25/69

Page 26: Cерьезные отношения: паттерны проектирования реляционных БД

Много ко многим (M:N)

Всегда сводится к двум 1:N

Например

А нужен ли он?

26/69

Page 27: Cерьезные отношения: паттерны проектирования реляционных БД

Много ко многим (M:N)

Можно реализовать через NESTED с ключами

27/69

Page 28: Cерьезные отношения: паттерны проектирования реляционных БД

Агрегация

«Слегка неравные» отношения

Всё также как с ассоциацией, но:

дополняем FK on delete set null

аналогично для мягких ссылок правим код

28/69

Page 29: Cерьезные отношения: паттерны проектирования реляционных БД

Композиция

«Сильно неравные» отношения

Всё также как с ассоциацией, но

дополняем FK on delete cascade

аналогично для мягких ссылок правим код

29/69

Page 30: Cерьезные отношения: паттерны проектирования реляционных БД

Композиция

Существует специальный способ реализации:

вложенная таблица (NESTED)

Используйте осторожно!

30/69

Page 31: Cерьезные отношения: паттерны проектирования реляционных БД

Отношения внутри одного класса

Последовательность

Иерархия

Граф

Синглтон

Перечисление

31/69

Page 32: Cерьезные отношения: паттерны проектирования реляционных БД

Последовательность

Что такое последовательность (sequence)

объектов?

По сути это 1:1

{sorted}

32/69

Page 33: Cерьезные отношения: паттерны проектирования реляционных БД

Последовательность

Сводим к 1:N и уникальности

Заметили проблемы?

{sorted}

33/69

Page 34: Cерьезные отношения: паттерны проектирования реляционных БД

Последовательность

Сводим к 1:N и уникальности

Упорядочиваем по полю

34/69

Page 35: Cерьезные отношения: паттерны проектирования реляционных БД

Последовательность

Сводим к 1:N и уникальности

Упорядочиваем по полю

Упорядочиваем по полю в контексте

35/69

Page 36: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Что такое иерархия объектов? Глава 1

Глава 1.1

Глава 1.2

Глава 1.2.1

Глава 1.3

Глава 2

По сути это 1:N

36/69

Page 37: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Реализуем как 1:N через FK

37/69

Page 38: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Реализуем как 1:N через мягкую ссылку

38/69

Page 39: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Особый способ реализации

Путь к файлу

C:\Windows\System32\cmd.exe

Нумерация разделов в оглавлении

Глава 1.7.4

39/69

Page 40: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Особый способ реализации

Уникальность полного пути

Возможны ссылки на полный путь

40/69

Page 41: Cерьезные отношения: паттерны проектирования реляционных БД

Иерархия

Иногда используется для ассоциаций

Это не совсем целевое назначение,

но иногда допустимо

Все паттерны для одного класса

ограниченно применимы для разных классов

41/69

Page 42: Cерьезные отношения: паттерны проектирования реляционных БД

Граф

Что такое граф?

42/69

Page 43: Cерьезные отношения: паттерны проектирования реляционных БД

Граф

Что такое граф?

43/69

Page 44: Cерьезные отношения: паттерны проектирования реляционных БД

Граф

Что такое граф?

Это отношение N:M внутри одного класса

44/69

Page 45: Cерьезные отношения: паттерны проектирования реляционных БД

Граф

Что такое граф?

Ориентированный

Реализуем N:M между узлами

Не ориентированный

Храним как ориентированный с правилом

упорядочивания

Храним по два ребра

45/69

Page 46: Cерьезные отношения: паттерны проектирования реляционных БД

Граф

Бойтесь графов!

46/69

Page 47: Cерьезные отношения: паттерны проектирования реляционных БД

Циклы

Циклы могут быть во всех перечисленных

отношениях

Проверка

Проверка циклов не тривиальна

Нельзя наложить простое условие

на отсутствие циклов (только триггер)

47/69

Page 48: Cерьезные отношения: паттерны проектирования реляционных БД

Синглтон (Одиночка, Singleton)

Что такое синглтон?

Что такое хранимый синглтон?

Необязательный (0–1)

Запрет создания новых

Права, триггеры, ограничения

уникальности…

Обязательный (1–1)

Запрет удаления

Права, триггеры, …

48/69

Page 49: Cерьезные отношения: паттерны проектирования реляционных БД

Перечисление (enumeration)

Что такое перечисление?

Строго заданный набор объектов

Можно не хранить в СУБД

Строковое поле с идентификатором

и ограничением CHECK

Можно хранить как обычную сущность

Удобство ссылки на строковый код

49/69

Page 50: Cерьезные отношения: паттерны проектирования реляционных БД

Паттерны отношений классов

Вводная

Паттерны?

Парадигмы

Паттерны для СУБД: что это?

Отношения объектов

Отношения классов

Перекус

Практика

Мы здесь

50/69

Page 51: Cерьезные отношения: паттерны проектирования реляционных БД

Отношения классов

Отношения между классами,

а не экземплярами

Отношения между объектами

метаинформации

51/69

Page 52: Cерьезные отношения: паттерны проектирования реляционных БД

Отношения классов

Наследование (обобщение)

Реализация (интерфейс)

Зависимость

Рефлексия (поведенческий)

52/69

Page 53: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

Наследования поведения почти нет,

в основном структура

53/69

Page 54: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

А нужно ли на уровне хранения учитывать

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

Не имеет отношений

54/69

Page 55: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

А нужно ли на уровне хранения учитывать

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

Имеет отношения

55/69

Page 56: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

А нужно ли на уровне хранения учитывать

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

Будут ли в отношениях объектов

участвовать предки?

Нет = можно не рассматривать классы

как связанные

Да = придется рассматривать

56/69

Page 57: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

Одна таблица и дискриминатор

Humans

id type sex birthday name degree

1 PROFESSOR M 02/03/76 Иванов И. П. CANDIDATE

2 STUDENT M 01/07/94 Петров С. И.

3 PROFESSOR F 05/12/63 Сидорова А. Е. DOCTOR

4 STUDENT F 17/10/95 Неизвестная А. М.

5 STUDENT M 04/02/95 Криворуков П. Р.

57/69

Page 58: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

Одна таблица и дискриминатор

Разбиение на таблицы

id type sex birthday name

1 PROFESSOR M 02/03/76 Иванов И.П.

2 STUDENT M 01/07/94 Петров С.И.

3 PROFESSOR F 05/12/63 Сидорова А.Е.

4 STUDENT F 17/10/95 Неизвестная А.М.

5 STUDENT M 04/02/95 Криворуков П.Р.

Humans

Students Professors

id

2

4

5

id degree

1 CANDIDATE

3 DOCTOR

58/69

Page 59: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

Одна таблица и дискриминатор

Разбиение на таблицы

Нужен ли здесь дискриминатор?

59/69

Page 60: Cерьезные отношения: паттерны проектирования реляционных БД

Наследование (обобщение)

Одна таблица и дискриминатор

Разбиение на таблицы

Множественное наследование

60/69

Page 61: Cерьезные отношения: паттерны проектирования реляционных БД

Реализация (интерфейс)

61/69

Page 62: Cерьезные отношения: паттерны проектирования реляционных БД

Реализация (интерфейс)

Обычно реализуется через представления

CREATE VIEW CODED_ENTITY AS

SELECT id, code FROM …

UNION ALL

SELECT code FROM …

62/69

Page 63: Cерьезные отношения: паттерны проектирования реляционных БД

Реализация (интерфейс)

Обычно реализуется через представления

63/69

Page 64: Cерьезные отношения: паттерны проектирования реляционных БД

Реализация (интерфейс)

Можно реализовать как множественное

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

64/69

Page 65: Cерьезные отношения: паттерны проектирования реляционных БД

Зависимость

Можно реализовать через триггеры на DDL

или автогенерацию

65/69

Page 66: Cерьезные отношения: паттерны проектирования реляционных БД

Рефлексия

В стандарте нет

Практически во всех СУБД доступна

Есть в стандартных обертках для СУБД

(JDBC…)

66/69

Page 67: Cерьезные отношения: паттерны проектирования реляционных БД

План

Вводная

Паттерны?

Парадигмы

Паттерны для СУБД: что это?

Отношения объектов

Отношения классов

Перекус

Практика

Мы здесь

67/69

Page 68: Cерьезные отношения: паттерны проектирования реляционных БД

68/69

Page 69: Cерьезные отношения: паттерны проектирования реляционных БД

Спасибо!

Вопросы?

Максим Зинченко

[email protected]

69/69