Материал: Using_MySql,_MS_SQL_Server_and_Oracle(1)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

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

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

Модель для Oracle

1.4. Модель для Oracle

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

Целочисленные поля представлены типом number с указанием длины — это наиболее простой способ эмуляции целочисленных типов из других СУБД.

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

Поле sb_is_active представлено типом char длиной в один символ (т.к. в Oracle нет типа данных enum), а для соблюдения аналогии с MySQL приме-

нено то же решение, что и в случае с MS SQL Server: на это поле наложено ограничение check со значением "sb_is_active" IN ('Y', 'N').

Для полей sb_start и sb_finish выбран тип date как «самый простой» из имеющихся в Oracle типов хранения даты. Да, он всё равно сохраняет часы, минуты и секунды, но мы можем вписать туда нулевые значения.

erd Oracle_schema

 

 

 

 

 

 

 

 

 

genres

 

 

 

books

 

 

 

 

 

«column»

 

«column»

 

 

 

 

 

 

 

 

 

 

 

 

 

*PK g_id: NUMBER(10)

*PK b_id: NUMBER(10)

 

 

 

 

*

g_name: NVARCHAR2(150)

*

b_name: NVARCHAR2(150)

 

 

 

 

 

 

+PK_books

 

 

 

*

b_year: NUMBER(5)

 

 

 

 

 

 

 

 

 

«PK»

 

*

b_quantity: NUMBER(5)

1

 

(sb_book = b_id)

+

PK_genres(NUMBER)

 

 

 

 

+FK_subscriptions_books

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

 

«PK»

 

 

 

 

 

«unique»

 

 

 

 

 

0..*

 

 

+

PK_books(NUMBER)

 

 

 

+

UQ_genres_g_name(NVARCHAR2)

 

 

 

 

 

 

 

 

 

 

 

 

+PK_genres

1

+PK_books

1

+PK_books

1

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

«FK»

 

 

(b_id = b_id)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«FK»

 

 

 

 

 

 

 

 

 

 

 

+FK_m2m_books_genres_genres

+FK_m2m_books_genres_books

 

 

 

 

 

 

 

 

 

 

 

 

 

0..*

0..*

 

 

 

 

 

 

 

subscriptions

«column»

*PK sb_id: NUMBER(10)

*FK

sb_subscriber: NUMBER(10)

*FK

sb_book: NUMBER(10)

*sb_start: DATE

*sb_finish: DATE

*sb_is_active: CHAR(1)

«FK»

+FK_subscriptions_books(NUMBER)

+FK_subscriptions_subscribers(NUMBER)

«PK»

+PK_subscriptions(NUMBER)

«check»

+check_enum(CHAR)

 

 

 

 

subscribers

 

 

 

«column»

+PK_subscribers

*PK

s_id: NUMBER(10)

(sb+FKsubscribersubscriptions= __id)subscribers

 

 

1

*

s_name: NVARCHAR2(150)

0..*

«FK»

 

 

 

 

 

 

 

 

 

«PK»

+PK_subscribers(NUMBER)

 

m2m_books_genres

+FK_m2m_books_authors_books 0..*

 

 

 

 

 

 

 

 

 

 

 

 

authors

 

«column»

m2m_books_authors

 

 

 

 

 

*PK b_id: NUMBER(10)

 

+FK_m2m_books_authors_authors

 

«column»

*PK g_id: NUMBER(10)

«column»

 

 

 

*PK a_id: NUMBER(10)

 

 

*pfK b_id: NUMBER(10)

 

(a_id = a_id)

*

a_name: NVARCHAR2(150)

 

«PK»

*pfK a_id: NUMBER(10)

 

«FK»

1

 

 

+

PK_m2m_books_genres(NUMBER, NUMBER)

 

0..*

+PK_authors

 

«PK»

 

 

 

 

 

«FK»

 

 

 

+

PK_authors(NUMBER)

+FK_m2m_books_authors_authors(NUMBER)

+FK_m2m_books_authors_books(NUMBER)

«PK»

+PK_m2m_books_authors(NUMBER, NUMBER)

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

Рисунок 1.g — Модель базы данных для Oracle в Oracle SQL Developer Data Modeler

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

Генерация и наполнение базы данных

1.5. Генерация и наполнение базы данных

На основе созданных в Sparx Enterprise Architect моделей получим DDLскрипты{4} для каждой СУБД и выполним их, чтобы создать базы данных (обратитесь к документации по Sparx EA за информацией о том, как на основе модели базы данных получить скрипт её генерации).

Наполним имеющиеся базы данных следующими данными.

Таблица books:

b_id

 

b_name

b_year

b_quantity

1

Евгений Онегин

1985

2

2

Сказка о рыбаке и рыбке

1990

3

3

Основание и империя

2000

5

4

Психология программирования

1998

1

5

Язык программирования С++

1996

3

6

Курс теоретической физики

1981

12

7

Искусство программирования

1993

7

 

 

 

 

 

Таблица

authors

:

 

 

 

 

 

 

 

 

 

 

a_id

 

a_name

 

 

1

Д. Кнут

 

 

2

А. Азимов

 

 

3

Д. Карнеги

 

 

4

Л.Д. Ландау

 

 

5

Е.М. Лифшиц

 

 

6

Б. Страуструп

 

 

7

А.С. Пушкин

 

 

 

 

 

 

Таблица

genres

:

 

 

 

 

 

 

 

 

 

g_id

 

g_name

 

 

1

Поэзия

 

 

2

Программирование

 

 

3

Психология

 

 

4

Наука

 

 

5

Классика

 

 

6

Фантастика

 

 

 

 

 

Таблица

subscribers

:

 

 

 

 

 

 

 

s_id

 

s_name

 

 

1

Иванов И.И.

 

 

2

Петров П.П.

 

 

3

Сидоров С.С.

 

 

4

Сидоров С.С.

 

 

Присутствие двух читателей с именем «Сидоров С.С.» — не ошибка. Нам понадобится такой вариант полных тёзок для демонстрации нескольких типичных ошибок в запросах.

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

Генерация и наполнение базы данных

Таблица

m2m_books_authors

:

 

 

 

 

 

 

 

 

 

 

 

 

 

b_id

a_id

 

 

 

 

 

 

 

 

1

7

 

 

 

 

 

 

 

 

 

2

7

 

 

 

 

 

 

 

 

 

3

2

 

 

 

 

 

 

 

 

 

4

3

 

 

 

 

 

 

 

 

 

4

6

 

 

 

 

 

 

 

 

 

5

6

 

 

 

 

 

 

 

 

 

6

5

 

 

 

 

 

 

 

 

 

6

4

 

 

 

 

 

 

 

 

 

7

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица

m2m_books_genres

:

 

 

 

 

 

 

 

 

 

 

 

 

 

b_id

g_id

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

1

5

 

 

 

 

 

 

 

 

 

2

1

 

 

 

 

 

 

 

 

 

2

5

 

 

 

 

 

 

 

 

 

3

6

 

 

 

 

 

 

 

 

 

4

2

 

 

 

 

 

 

 

 

 

4

3

 

 

 

 

 

 

 

 

 

5

2

 

 

 

 

 

 

 

 

 

6

5

 

 

 

 

 

 

 

 

 

7

2

 

 

 

 

 

 

 

 

 

7

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица

subscriptions

:

 

 

 

 

 

 

 

 

 

sb_id

sb_subscriber

sb_book

sb_start

sb_finish

sb_is_active

100

1

 

 

3

 

 

 

2011-01-12

2011-02-12

N

2

1

 

 

1

 

 

 

2011-01-12

2011-02-12

N

3

3

 

 

3

 

 

 

2012-05-17

2012-07-17

Y

42

1

 

 

2

 

 

 

2012-06-11

2012-08-11

N

57

4

 

 

5

 

 

 

2012-06-11

2012-08-11

N

61

1

 

 

7

 

 

 

2014-08-03

2014-10-03

N

62

3

 

 

5

 

 

 

2014-08-03

2014-10-03

Y

86

3

 

 

1

 

 

 

2014-08-03

2014-09-03

Y

91

4

 

 

1

 

 

 

2015-10-07

2015-03-07

Y

95

1

 

 

4

 

 

 

2015-10-07

2015-11-07

N

99

4

 

 

4

 

 

 

2015-10-08

2025-11-08

Y

Странные комбинации дат выдачи и возврата книг (2015-10-07 / 2015-03-07 и 2015-10-08 / 2025-11-08) добавлены специально, чтобы продемонстрировать в дальнейшем особенности решения некоторых задач.

Также обратите внимание, что среди читателей, бравших книги, ни разу не встретился «Петров П.П.» (с идентификатором 2), это тоже понадобится нам в будущем.

Неупорядоченность записей по идентификаторам и «пропуски» в нумерации идентификаторов также сделаны осознанно для большей реалистичности.

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

Генерация и наполнение базы данных

После вставки данных в базы данных под управлением всех трёх СУБД стоит проверить, не ошиблись ли мы где-то. Выполним следующие запросы, которые позволят увидеть данные о книгах и работе библиотеки в человекочитаемом виде. Разбор этих запросов представлен в примере 11{66}, а пока — просто код:

MySQL

1SELECT `b_name`,

2`a_name`,

3`g_name`

4 FROM `books`

5JOIN `m2m_books_authors` USING(`b_id`)

6JOIN `authors` USING(`a_id`)

7JOIN `m2m_books_genres` USING(`b_id`)

8JOIN `genres` USING(`g_id`)

MS SQL

1SELECT [b_name],

2[a_name],

3[g_name]

4 FROM [books]

5JOIN [m2m_books_authors]

6ON [books].[b_id] = [m2m_books_authors].[b_id]

7JOIN [authors]

8ON [m2m_books_authors].[a_id] = [authors].[a_id]

9JOIN [m2m_books_genres]

10ON [books].[b_id] = [m2m_books_genres].[b_id]

11JOIN [genres]

12ON [m2m_books_genres].[g_id] = [genres].[g_id]

Oracle

1SELECT "b_name",

2"a_name",

3"g_name"

4 FROM "books"

5JOIN "m2m_books_authors"

6ON "books"."b_id" = "m2m_books_authors"."b_id"

7JOIN "authors"

8ON "m2m_books_authors"."a_id" = "authors"."a_id"

9JOIN "m2m_books_genres"

10ON "books"."b_id" = "m2m_books_genres"."b_id"

11JOIN "genres"

12ON "m2m_books_genres"."g_id" = "genres"."g_id"

После выполнения этих запросов получится результат, показывающий, как информация из разных таблиц объединяется в осмысленные наборы:

b_name

a_name

g_name

Евгений Онегин

А.С. Пушкин

Классика

Сказка о рыбаке и рыбке

А.С. Пушкин

Классика

Курс теоретической физики

Л.Д. Ландау

Классика

Курс теоретической физики

Е.М. Лифшиц

Классика

Искусство программирования

Д. Кнут

Классика

Евгений Онегин

А.С. Пушкин

Поэзия

Сказка о рыбаке и рыбке

А.С. Пушкин

Поэзия

Психология программирования

Д. Карнеги

Программирование

Психология программирования

Б. Страуструп

Программирование

Язык программирования С++

Б. Страуструп

Программирование

Искусство программирования

Д. Кнут

Программирование

Психология программирования

Д. Карнеги

Психология

Психология программирования

Б. Страуструп

Психология

Основание и империя

А. Азимов

Фантастика

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

Источник: https://studfile.net/preview/16418462/