Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
15.01.2021
Размер:
10.35 Mб
Скачать

Работа с MySQL, MS SQL Server и Oracle

в примерах

Практическое пособие для программистов и тестировщиков

Версия книги 1.0.3 от 12.04.2018

Работа с MySQL, MS SQL Server и Oracle в примерах

Содержание

ПРЕДИСЛОВИЕ ..........................................................................................................................................

4

РАЗДЕЛ 1: МОДЕЛЬ, ГЕНЕРАЦИЯ И НАПОЛНЕНИЕ БАЗЫ ДАННЫХ ..............................................

5

1.1.

ОБЩЕЕ ОПИСАНИЕ МОДЕЛИ .......................................................................................................

5

1.2.

МОДЕЛЬ ДЛЯ MYSQL .....................................................................................................................

7

1.3. МОДЕЛЬ ДЛЯ MS SQL SERVER ....................................................................................................

9

1.4.

МОДЕЛЬ ДЛЯ ORACLE.................................................................................................................

11

1.5. ГЕНЕРАЦИЯ И НАПОЛНЕНИЕ БАЗЫ ДАННЫХ .......................................................................

12

РАЗДЕЛ 2: ЗАПРОСЫ НА ВЫБОРКУ И МОДИФИКАЦИЮ ДАННЫХ ...............................................

17

2.1. ВЫБОРКА ИЗ ОДНОЙ ТАБЛИЦЫ ...............................................................................................

17

2.1.1.

ПРИМЕР 1: ВЫБОРКА ВСЕХ ДАННЫХ.............................................................................................

17

2.1.2.

ПРИМЕР 2: ВЫБОРКА ДАННЫХ БЕЗ ПОВТОРЕНИЯ..........................................................................

18

2.1.3.

ПРИМЕР 3: ИСПОЛЬЗОВАНИЕ ФУНКЦИИ COUNT И ОЦЕНКА ЕЁ ПРОИЗВОДИТЕЛЬНОСТИ.................

21

2.1.4.

ПРИМЕР 4: ИСПОЛЬЗОВАНИЕ ФУНКЦИИ COUNT В ЗАПРОСЕ С УСЛОВИЕМ ....................................

29

2.1.5.

ПРИМЕР 5: ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ SUM, MIN, MAX, AVG ...................................................

31

2.1.6.

ПРИМЕР 6: УПОРЯДОЧИВАНИЕ ВЫБОРКИ .....................................................................................

35

2.1.7.

ПРИМЕР 7: ИСПОЛЬЗОВАНИЕ СОСТАВНЫХ УСЛОВИЙ ....................................................................

39

2.1.8.

ПРИМЕР 8: ПОИСК МНОЖЕСТВА МИНИМАЛЬНЫХ И МАКСИМАЛЬНЫХ ЗНАЧЕНИЙ .............................

43

2.1.9.

ПРИМЕР 9: ВЫЧИСЛЕНИЕ СРЕДНЕГО ЗНАЧЕНИЯ АГРЕГИРОВАННЫХ ДАННЫХ .................................

55

2.1.10.

ПРИМЕР 10: ИСПОЛЬЗОВАНИЕ ГРУППИРОВКИ ДАННЫХ .................................................................

61

2.2.

ВЫБОРКА ИЗ НЕСКОЛЬКИХ ТАБЛИЦ.......................................................................................

66

2.2.1.ПРИМЕР 11: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ КАК СПОСОБ ПОЛУЧЕНИЯ ЧЕЛОВЕКОЧИТАЕМЫХ ДАННЫХ .66

2.2.2.

ПРИМЕР 12:

ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПРЕОБРАЗОВАНИЕ СТОЛБЦОВ В СТРОКИ ....................

71

2.2.3.

ПРИМЕР 13:

ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПОДЗАПРОСЫ С УСЛОВИЕМ IN ...................................

82

2.2.4.ПРИМЕР 14: НЕТРИВИАЛЬНЫЕ СЛУЧАИ ИСПОЛЬЗОВАНИЯ УСЛОВИЯ IN И ЗАПРОСОВ НА

ОБЪЕДИНЕНИЕ...........................................................................................................................................

92

2.2.5.

ПРИМЕР 15: ДВОЙНОЕ ИСПОЛЬЗОВАНИЕ УСЛОВИЯ IN ..................................................................

97

2.2.6.

ПРИМЕР 16: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ФУНКЦИЯ COUNT...................................................

102

2.2.7.

ПРИМЕР 17: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ, ФУНКЦИЯ COUNT И АГРЕГИРУЮЩИЕ ФУНКЦИИ .........

114

2.2.8.

ПРИМЕР 18: УЧЁТ ВАРИАНТОВ И КОМБИНАЦИЙ ПРИЗНАКОВ ........................................................

127

2.2.9.

ПРИМЕР 19: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПОИСК МИНИМУМА, МАКСИМУМА, ДИАПАЗОНОВ .......

132

2.2.10.

ПРИМЕР 20: ВСЕ РАЗНОВИДНОСТИ ЗАПРОСОВ НА ОБЪЕДИНЕНИЕ В ТРЁХ СУБД .........................

149

2.3. МОДИФИКАЦИЯ ДАННЫХ .........................................................................................................

182

2.3.1.

ПРИМЕР 21: ВСТАВКА ДАННЫХ ..................................................................................................

182

2.3.2.

ПРИМЕР 22: ОБНОВЛЕНИЕ ДАННЫХ ...........................................................................................

190

2.3.3.

ПРИМЕР 23: УДАЛЕНИЕ ДАННЫХ ................................................................................................

193

2.3.4.

ПРИМЕР 24: СЛИЯНИЕ ДАННЫХ .................................................................................................

195

2.3.5.

ПРИМЕР 25: ИСПОЛЬЗОВАНИЕ УСЛОВИЙ ПРИ МОДИФИКАЦИИ ДАННЫХ........................................

200

РАЗДЕЛ 3: ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ ...........................................................................

210

3.1. ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ПРЕДСТАВЛЕНИЙ ........................................

210

3.1.1.

ПРИМЕР 26: ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ НЕКЭШИРУЮЩИХ ПРЕДСТАВЛЕНИЙ............

210

3.1.2.ПРИМЕР 27: ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ КЭШИРУЮЩИХ ПРЕДСТАВЛЕНИЙ И ТАБЛИЦ 215

3.1.3.ПРИМЕР 28: ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ ДЛЯ СОКРЫТИЯ ЗНАЧЕНИЙ И СТРУКТУР ДАННЫХ241

3.2. МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ПРЕДСТАВЛЕНИЙ..............................

245

3.2.1.

ПРИМЕР 29: МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ «ПРОЗРАЧНЫХ» ПРЕДСТАВЛЕНИЙ ....

245

3.2.2.

ПРИМЕР 30: МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ НА ПРЕДСТАВЛЕНИЯХ .....

257

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 2/545

Работа с MySQL, MS SQL Server и Oracle в примерах

 

РАЗДЕЛ 4: ИСПОЛЬЗОВАНИЕ ТРИГГЕРОВ ......................................................................................

272

4.1. АГРЕГАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ ................................................

272

4.1.1. ПРИМЕР 31: ОБНОВЛЕНИЕ КЭШИРУЮЩИХ ТАБЛИЦ И ПОЛЕЙ .......................................................

272

4.1.2. ПРИМЕР 32: ОБЕСПЕЧЕНИЕ КОНСИСТЕНТНОСТИ ДАННЫХ ..........................................................

292

4.2. КОНТРОЛЬ ОПЕРАЦИЙ С ДАННЫМИ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ......................

315

4.2.1. ПРИМЕР 33: КОНТРОЛЬ ОПЕРАЦИЙ МОДИФИКАЦИИ ДАННЫХ .......................................................

315

4.2.2. ПРИМЕР 34: КОНТРОЛЬ ФОРМАТА И ЗНАЧЕНИЙ ДАННЫХ .............................................................

338

4.2.3. ПРИМЕР 35: ПРОЗРАЧНОЕ ИСПРАВЛЕНИЕ ОШИБОК В ДАННЫХ ....................................................

344

РАЗДЕЛ 5: ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ФУНКЦИЙ И ПРОЦЕДУР ..........................................

352

5.1.

ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ФУНКЦИЙ ............................................................................

352

5.1.1. ПРИМЕР 36: ВЫБОРКА И МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ХРАНИМЫХ ФУНКЦИЙ......

352

5.1.2. ПРИМЕР 37: КОНТРОЛЬ ОПЕРАЦИЙ С ДАННЫМИ С ИСПОЛЬЗОВАНИЕМ ХРАНИМЫХ ФУНКЦИЙ ........

370

5.2.

ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ПРОЦЕДУР ..........................................................................

375

5.2.1. ПРИМЕР 38: ВЫПОЛНЕНИЕ ДИНАМИЧЕСКИХ ЗАПРОСОВ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР .......

375

5.2.2. ПРИМЕР 39: ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР...........

388

5.2.3. ПРИМЕР 40: УПРАВЛЕНИЕ СТРУКТУРАМИ БАЗЫ ДАННЫХ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР ......

400

РАЗДЕЛ 6: ИСПОЛЬЗОВАНИЕ ТРАНЗАКЦИЙ ...................................................................................

408

6.1. УПРАВЛЕНИЕ НЕЯВНЫМИ И ЯВНЫМИ ТРАНЗАКЦИЯМИ...................................................

408

6.1.1. ПРИМЕР 41: УПРАВЛЕНИЕ НЕЯВНЫМИ ТРАНЗАКЦИЯМИ...............................................................

408

6.1.2. ПРИМЕР 42: УПРАВЛЕНИЕ ЯВНЫМИ ТРАНЗАКЦИЯМИ...................................................................

419

6.2.

КОНКУРИРУЮЩИЕ ТРАНЗАКЦИИ............................................................................................

428

6.2.1. ПРИМЕР 43: УПРАВЛЕНИЕ УРОВНЕМ ИЗОЛИРОВАННОСТИ ТРАНЗАКЦИЙ.......................................

428

6.2.2. ПРИМЕР 44: ВЗАИМОДЕЙСТВИЕ КОНКУРИРУЮЩИХ ТРАНЗАКЦИЙ.................................................

434

6.2.3.ПРИМЕР 45: УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ В ТРИГГЕРАХ, ХРАНИМЫХ ФУНКЦИЯХ И ПРОЦЕДУРАХ .465

РАЗДЕЛ 7: РЕШЕНИЕ ТИПИЧНЫХ ЗАДАЧ И ВЫПОЛНЕНИЕ ТИПИЧНЫХ ОПЕРАЦИЙ .............

474

7.1. РАБОТА С ИЕРАРХИЧЕСКИМИ И СВЯЗАННЫМИ СТРУКТУРАМИ.....................................

474

7.1.1. ПРИМЕР 46: ФОРМИРОВАНИЕ И АНАЛИЗ ИЕРАРХИЧЕСКИХ СТРУКТУР...........................................

474

7.1.2. ПРИМЕР 47: ФОРМИРОВАНИЕ И АНАЛИЗ СВЯЗАННЫХ СТРУКТУР..................................................

490

7.2. ОПЕРАЦИИ С БАЗАМИ ДАННЫХ .............................................................................................

516

7.2.1. ПРИМЕР 48: РЕЗЕРВНОЕ КОПИРОВАНИЕ И ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ ..............................

516

7.3. ОПЕРАЦИИ С СУБД ....................................................................................................................

522

7.3.1. ПРИМЕР 49: УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ, ЗАПУСК И ОСТАНОВКА СУБД ...............................

522

7.3.2. ПРИМЕР 50: ОПРЕДЕЛЕНИЕ И ИЗМЕНЕНИЕ КОДИРОВОК ..............................................................

525

7.4. ПОЛЕЗНЫЕ ОПЕРАЦИИ С ДАННЫМИ.....................................................................................

528

7.4.1. ПРИМЕР 51: ВЫЧИСЛЕНИЕ ДАТ ..................................................................................................

528

7.4.2. ПРИМЕР 52: ПОЛУЧЕНИЕ КОМБИНАЦИИ НЕПОВТОРЯЮЩИХСЯ ИДЕНТИФИКАТОРОВ......................

536

РАЗДЕЛ 8: КРАТКОЕ СРАВНЕНИЕ MYSQL, MS SQL SERVER, ORACLE.......................................

541

РАЗДЕЛ 9: ЛИЦЕНЗИЯ И РАСПРОСТРАНЕНИЕ................................................................................

545

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 3/545

Предисловие

Предисловие

Выражаю огромную благодарность коллегам из EPAM Systems за ценные замечания и рекомендации в процессе подготовки материала.

Эта книга посвящена практике использования SQL для решения типичных задач. Здесь не рассматривается теория реляционных баз данных (предполагается, что вы с ней знакомы либо способны найти недостающую информацию), но приведено более 500 SQL-запросов: от элементарных выборок до использования представлений, триггеров, хранимых процедур и функций.

Все примеры представлены в виде постановки задачи и её решения с использованием MySQL, MS SQL Server и Oracle, а также снабжены пояснениями и разбором типичных ошибок.

Этот материал в первую очередь будет полезен тем, кто:

когда-то изучал базы данных, но многое забыл;

имеет опыт работы с одной СУБД, но хочет быстро переключиться на другую;

хочет в предельно сжатые сроки научиться писать типичные SQL-запросы.

Все решения выполнены на MySQL Community Server 5.6, Microsoft SQL Server Express 2012, Oracle 11gR2 Express Edition и, скорее всего, успешно будут работать на более новых версиях этих СУБД, но не на более старых.

В большинстве решений со сложной логикой алгоритм пояснён на примере MySQL, а для двух других СУБД лишь приведён код с небольшими комментариями, потому желательно рассматривать решения для всех трёх СУБД, даже если вам интересна только одна из них.

Исходные материалы (схемы, скрипты и т.д.) можно получить по этой ссылке: http://svyatoslav.biz/database_book_download/src.zip

Условные обозначения, используемые в этой книге:

Постановка задачи. Сразу отметим, что почти в каждом рассмотренном примере приведено несколько задач. Поскольку решение задачи в некоторых случаях будет размещено далеко от её формулировки, рядом с номером задачи в фигурных скобках будет приведена {ссылка} на решение.

Ожидаемый результат. Сначала мы будем показывать, что должно получаться при правильном решении задачи, а потом — само решение.

Решение задачи. Решение всегда будет приведено для MySQL, MS SQL Server и Oracle. Иногда решения будут похожими, иногда очень разными. Поскольку решение задачи в некоторых случаях будет размещено далеко от её формулировки, рядом с номером решения в фигурных скобках будет приведена {ссылка} на формулировку задачи.

Исследование. Это — тоже задача, но уже не на получение неких данных, а на проверку того, как ведёт себя СУБД в некоторых условиях.

Предостережение. Мы будем рассматривать типичные ошибки и приводить пояснения их причин и последствий.

Задание для самостоятельной проработки. Настоятельно рекоменду-

ется выполнять эти задания. Даже если вам кажется, что всё очень просто. Если, напротив, вам кажется, что всё очень сложно — сначала попробуйте самостоятельно решить уже разобранные примеры, обращаясь к готовому решению лишь для самопроверки.

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 4/545

Раздел 1: Модель, генерация и наполнение базы данных

Раздел 1: Модель, генерация и наполнение базы данных 1.1. Общее описание модели

Для решения задач и рассмотрения примеров мы будем использовать три базы данных: «Библиотека», «Большая библиотека» и «Исследование». База данных «Исследование» будет состоять из множества разрозненных таблиц, необходимых для демонстрации особенностей поведения СУБД, и мы будем формировать её постепенно по мере проведения экспериментов. Также в ней будет физически расположена база данных «Большая библиотека».

Модели баз данных «Библиотека» и «Большая библиотека» полностью идентичны (отличаются эти базы данных только количеством записей). Здесь всего семь таблиц:

genres — описывает литературные жанры:

og_id — идентификатор жанра (число, первичный ключ);

og_name — имя жанра (строка);

books — описывает книги в библиотеке:

ob_id — идентификатор книги (число, первичный ключ);

ob_name — название книги (строка);

ob_year — год издания (число);

ob_quantity — количество экземпляров книги в библиотеке (число);

authors — описывает авторов книг:

oa_id — идентификатор автора (число, первичный ключ);

oa_name — имя автора (строка);

subscribers — описывает читателей (подписчиков) библиотеки:

os_id — идентификатор читателя (число, первичный ключ);

os_name — имя читателя (строка);

subscriptions — описывает факты выдачи/возврата книг (т.н. «подписки»):

osb_id — идентификатор подписки (число, первичный ключ);

osb_subscriber — идентификатор читателя (подписчика) (число, внешний ключ);

osb_book — идентификатор книги (число, внешний ключ);

osb_start — дата выдачи книги (дата);

osb_finish — запланированная дата возврата книги (дата);

osb_is_active — признак активности подписки (содержит значение Y, если книга ещё на руках у читателя, и N, если книга уже возвращена в библиотеку);

m2m_books_genres — служебная таблица для организации связи «многие ко многим» между таблицами books и genres:

ob_id — идентификатор книги (число, внешний ключ, часть составного

первичного ключа);

og_id — идентификатор жанра (число, внешний ключ, часть составного первичного ключа);

m2m_books_authors — служебная таблица для организации связи «многие ко многим» между таблицами books и authors:

ob_id — идентификатор книги (число, внешний ключ, часть составного

первичного ключа);

oa_id — идентификатор автора (число, внешний ключ, часть составного первичного ключа).

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 5/545

Общее описание модели

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

Общая схема базы данных представлена на рисунке 1.a. Скрипты генерации баз данных для каждой СУБД вы можете найти в исходном материале, ссылка на который приведена в предисловии{4}.

class Library_data_model

 

 

 

 

 

 

 

 

 

 

subscriptions

subscribers

 

 

 

books

«column»

«column»

 

 

 

*PK

sb_id

*PK

s_id

 

 

 

 

 

genres

 

«column»

*

sb_subscriber

*

s_name

 

 

 

*

sb_book

 

 

 

 

*PK b_id

 

 

«column»

*

sb_start

 

 

*

b_name

 

 

*PK

g_id

*

sb_finish

 

 

*

b_year

 

 

*

g_name

*

sb_is_active

 

 

*

b_quantity

 

 

 

 

 

 

 

 

m2m_books_genres

 

 

authors

 

m2m_books_authors

 

 

 

 

«column»

 

 

«column»

*PK b_id

«column»

 

*PK a_id

 

*PK g_id

*PK b_id

*

a_name

 

 

*PK a_id

 

 

 

Рисунок 1.a — Общая схема базы данных

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 6/545

Модель для MySQL

1.2. Модель для MySQL

Модель базы данных для MySQL представлена на рисунках 1.b и 1.c. Обратите внимание на следующие важные моменты:

Первичные ключи представлены беззнаковыми целыми числами для расширения максимального диапазона значений.

Строки представлены типом varchar длиной до 150 символов (чтобы гарантированно уложиться в ограничение 767 байт на длину индекса; 150*4 = 600, MySQL выравнивает символы UTF-строк на длину в четыре байта на символ при операциях сравнения).

Поле sb_is_active представлено характерным для MySQL типом данных enum (позволяющим выбрать одно из указанных значений и очень удобным для хранения заранее известного предопределённого набора значений — Y и N в нашем случае).

Поле g_name сделано уникальным, т.к. существование одноимённых жанров недопустимо.

Поля sb_start и sb_finish представлены типом date (а не более полными, например, datetime), т.к. мы храним дату выдачи и возврата книги с точностью до дня.

class MySQL_schema

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

books

 

 

 

 

 

 

 

 

 

 

 

 

 

subscribers

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

genres

 

 

 

«column»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«column»

 

 

 

 

 

 

*PK b_id: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

 

«column»

 

 

 

 

 

 

 

 

 

 

 

 

 

*PK s_id: INTEGER UNSIGNED

 

 

 

 

*

b_name: VARCHAR(150)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

s_name: VARCHAR(150)

 

*PK g_id: INTEGER UNSIGNED

*

b_year: SMALLINT UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

g_name: VARCHAR(150)

*

b_quantity: SMALLINT UNSIGNED

 

 

 

 

 

 

 

 

«PK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«PK»

 

 

 

«PK»

 

 

 

+PK_books

 

 

 

 

 

 

 

+

PK_subscribers(INTEGER)

 

 

 

 

 

 

 

 

 

 

 

+PK_subscribers

 

 

 

 

+

PK_genres(INTEGER)

+

PK_books(INTEGER)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

«unique»

 

 

 

 

 

 

 

 

(sb_subscriber = s_id)

 

 

 

 

 

 

 

+PK_books +PK1_books 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

UQ_genres_g_name(VARCHAR)

 

 

 

(sb_book = b_id)

 

 

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

subscriptions

 

 

 

+FK_subscriptions_subscribers

 

 

+PK_genres

1

 

 

(b_id = b_id)

 

+FK_subscriptions_books

«column»

 

 

0..*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0..*

*PK sb_id: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

(g_id = g_id)

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*FK

sb_subscriber: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

 

 

 

 

*FK sb_book: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(b_id = b_id)

* sb_start: DATE

 

 

 

 

 

 

 

 

 

 

 

+FK_m2m_books+FKgenresm2mgenresbooks0genres..* _books 0..*

 

* sb_finish: DATE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

sb_is_active: ENUM = ('Y', 'N')

 

 

 

 

 

 

 

 

 

 

 

 

m2m_books_genres

 

 

 

 

 

 

 

 

 

 

 

 

 

authors

 

 

 

 

 

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«column»

 

 

 

 

 

 

+

FK_subscriptions_books(INTEGER)

 

 

«column»

 

 

 

 

 

 

 

 

 

+

FK_subscriptions_subscribers(INTEGER)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*pfK b_id: INTEGER UNSIGNED

 

 

 

 

 

*PK a_id: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*pfK g_id: INTEGER UNSIGNED

 

 

 

 

«PK»

 

 

 

*

 

a_name: VARCHAR(150)

 

 

 

 

 

 

 

 

 

 

 

 

+

PK_subscriptions(INTEGER)

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

+FK_m2m_books_authors_books 0..*

+PK_authors

«PK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

FK_m2m_books_genres_books(INTEGER)

 

 

 

 

 

1 +

 

 

 

 

 

 

 

 

 

 

 

 

 

(a_id = a_id)

 

PK_authors(INTEGER)

 

 

+

FK_m2m_books_genres_genres(INTEGER)

 

 

 

m2m_books_authors

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«PK»

 

 

 

 

 

 

 

 

+FK_m2m_books_authors_authors

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

PK_m2m_books_genres(INTEGER, INTEGER)

 

 

 

«column»

 

 

0..*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*pfK b_id: INTEGER UNSIGNED

 

 

 

 

 

 

 

 

 

*pfK a_id: INTEGER UNSIGNED

«FK»

+FK_m2m_books_authors_authors(INTEGER)

+FK_m2m_books_authors_books(INTEGER)

«PK»

+PK_m2m_books_authors(INTEGER, INTEGER)

Рисунок 1.b — Модель базы данных для MySQL в Sparx EA

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 7/545

Модель для MySQL

Рисунок 1.c — Модель базы данных для MySQL в MySQL Workbench

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 8/545

Модель для MS SQL Server

1.3. Модель для MS SQL Server

Модель базы данных для MS SQL Server представлена на рисунках 1.d и 1.e. Обратите внимание на следующие важные моменты:

Первичные ключи представлены знаковыми целыми числами, т.к. в MS SQL Server нет возможности сделать bigint, int и smallint беззнаковыми (а tinyint, наоборот, бывает только беззнаковым).

Строки представлены типом nvarchar длиной до 150 символов (как из соображений аналогии с MySQL, так и чтобы гарантированно уложиться в ограничение 900 байт на длину индекса; 150*2 = 300, MS SQL Server для хранения и сравнения символов в национальных кодировках использует два байта на символ).

Поле sb_is_active представлено типом char длиной в один символ (т.к. в MS SQL Server нет типа данных enum), а для соблюдения аналогии с MySQL на это поле наложено ограничение check со значением [sb_is_active] IN ('Y', 'N').

Как и в MySQL, поля sb_start и sb_finish представлены типом date (а не более полными, например, datetime), т.к. мы храним дату выдачи и возврата книги с точностью до дня.

erd MSSQL_schema

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

genres

 

 

 

 

 

 

 

subscriptions

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

books

 

 

 

 

 

 

 

 

 

 

subscribers

 

 

 

 

 

 

 

 

«column»

 

 

 

 

 

 

«column»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*PK

sb_id: int

 

 

 

 

 

 

*PK

g_id: int

 

«column»

 

+PK_books

 

 

 

 

«column»

 

 

*FK

sb_subscriber: int

 

 

 

 

*PK

s_id: int

*

g_name: nvarchar(150)

*PK

b_id: int

 

 

+PK_subscribers

 

 

 

*FK

sb_book: int

 

*

s_name: nvarchar(150)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

b_name: nvarchar(150)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(sb_subscriber = s_id)

 

«PK»

 

 

 

 

 

(sb_book = b_id)

*

sb_start: date

 

+FK_subscriptions_subscribers

 

 

*

b_year: smallint

 

 

 

1

 

 

 

 

*

sb_finish: date

 

«FK»

«PK»

+

PK_genres(int)

 

*

b_quantity: smallint

1

 

 

 

 

«FK»

*

sb_is_active: char(1)

0..*

 

 

 

 

«unique»

 

 

 

 

 

 

0..*

 

 

 

+

PK_subscribers(int)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

UQ_genres_g_name(nvarchar)

«PK»

 

+FK_subscriptions_books

 

 

 

 

 

 

 

 

 

 

 

+

PK_books(int)

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

+

FK_subscriptions_books(int)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+PK_genres

1

+PK_books

1+PK_books

1

 

 

+

FK_subscriptions_subscribers(int)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«PK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

PK_subscriptions(int)

 

 

 

 

 

 

 

(g_id = g_id)

(b_id = b_id)

 

 

 

 

«check»

 

 

 

 

 

 

 

 

 

 

 

(b_id = b_id)

 

 

 

 

 

 

 

 

 

«FK»

«FK»

 

+

check_enum(char)

 

 

 

 

 

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+FK_m2m_books_genres_genres

0..*

0..* +FK_m2m_books_genres_books

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m2m_books_genres

 

 

 

0..*

+FK_m2m_books_authors_books

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«column»

 

 

 

m2m_books_authors

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*pfK b_id: int

 

 

«column»

 

 

 

 

 

 

 

 

authors

 

*pfK g_id: int

 

 

 

 

 

+FK_m2m_books_authors_authors

 

 

 

 

 

*pfK b_id: int

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

*pfK a_id: int

 

 

 

(a_id = a_id)

+PK_authors

«column»

 

 

 

 

 

 

 

 

 

 

*PK

a_id: int

 

+

FK_m2m_books_genres_books(int)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

 

0..*

«FK»

 

*

a_name: nvarchar(150)

 

+

FK_m2m_books_genres_genres(int)

 

 

 

1

 

+

FK_m2m_books_authors_authors(int)

 

 

 

 

 

 

 

 

«PK»

 

 

 

 

 

 

 

 

 

 

 

 

 

+

FK_m2m_books_authors_books(int)

 

 

 

«PK»

 

 

 

+

PK_m2m_books_genres(int, int)

 

 

 

 

 

 

«PK»

 

 

 

 

 

 

+

PK_authors(int)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+PK_m2m_books_authors(int, int)

Рисунок 1.d — Модель базы данных для MS SQL Server в Sparx EA

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 9/545