СУБД. Лекция 1

СУБД
Алехин Владислав
Лекция 1

Знакомство

Алехин Владислав, Senior Bigdata Engineer

Знакомство, введение в реляционные базы данных

Организационные моменты

Правила игры

Слайды доступны по адресу: https://3kybika.github.io/technopark-dbms-lectures/

Контроль знаний

burn.png
Экзамен ― это уникальная возможность для студента два раза в год узнать что-то полезное хотя бы на несколько дней.
© Французский бизнесмен и творческая личность Жорж Элгози

Интересные факты

1 https://habrahabr.ru/post/26289/
2 https://planet.openstreetmap.org/
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь.
Народная мудрость

Зачем вообще нужны СУБД?

Допустим, мы реализуем приложение "Поваренная книга" для хранения рецептов.

Все нетривиальные абстракции дырявы.
© Джоэл Спольски

Стоимость типовых операций

Стоимость операции нс (ns) мкс (µs) мс (ms)
Получение значения из L1 0.5
Ошибка предсказания перехода в CPU 5
Получение значения из L2 7
Mutex lock/unlock 25
Получение значения из RAM 100
Сжатие 1Кб методом Zippy 3 000 3
Отправка 1Кб через 1Гбит/сек сеть 10 000 10
Чтение 4Кб с SSD (случайный доступ) 150 000 150
Чтение 1Мб из RAM (последовательный доступ) 250 000 250
Round trip внутри одного ДЦ 500 000 500
Чтение 1Мб из SSD (последовательный доступ) 1 000 000 1 000 1
Позиционирование HDD 10 000 000 10 000 10
Чтение 1Мб из HDD (последовательный доступ) 20 000 000 20 000 20
Round trip между США и Нидерландами 150 000 000 150 000 150

Задача курса

Проектирование и диаграммы

SQL

Оптимизация

“Ну и запросы у вас” - сказала база данных и повисла.

Администрирование

На моей работе самая страшная фраза это: “ребята, за какую дату у нас есть бэкап базы данных?”
© bash.im

High-Load и Big Data

Кратенькая история

Реляционные БД

… многие отдали предпочтение реляционным системам баз данных, поскольку используемый в них стандартизованный язык SQL открывал возможности безболезненного перехода от одной СУБД к другой. Хотя воспользовались ими на практике только единицы, мысль о возможной смене поставщика СУБД, не связанной со сколько-нибудь ощутимыми затратами, согревала всех.
Мартин Фаулер

NoSQL

Литература

Определение БД

База данных (БД)
Это взаимосвязанная информация (данные) об объектах, которая организованна специальным образом и хранится на каком-либо носителе.

Реляционная модель данных

Целое Строка Целое Типы данных
номер имя должность деньги Домены
Отношение
Табельный номер Имя Должность Оклад Премия Аттрибуты
2934 Иванов Инженер 112 40 Кортежи
2935 Петров Вед. Инженер 144 50
2936 Сидоров Бухгалтер 92 35
Ключ

Терминология

Домен
Тип данных, то есть допустимое множество значений.
Кортеж
Множество пар {имя атрибута, значение}, которое содержит одно вхождение каждого имени атрибута, принадлежащего схеме отношения.
Отношение
Множество кортежей (не упорядоченное).
Целостность базы данных
Соответствие имеющейся в базе данных информации её внутренней логике, структуре и всем явно заданным правилам.

Реляционная модель данных

Реляционная модель данных (РМД)
Логическая модель данных, прикладная теория построения баз данных, которая является приложением к задачам обработки данных таких разделов математики как теории множеств и логика первого порядка.

Реляционная модель данных включает следующие компоненты:

Структурный аспект (составляющая)
Данные в базе данных представляют собой набор отношений.
Аспект (составляющая) целостности
Отношения (таблицы) отвечают определенным условиям целостности. РМД поддерживает декларативные ограничения целостности уровня домена (типа данных), уровня отношения и уровня базы данных.
Аспект (составляющая) обработки (манипулирования)
РМД поддерживает операторы манипулирования отношениями (реляционная алгебра, реляционное исчисление).

Реляционная алгебра

Эдгар Франк «Тед» Кодд

Выборка (A WHERE c)

Персоны

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80

`sigma_("Возраст" >= 34)("Персоны")`

Имя Возраст Вес
Harry 34 80
Helena 54 54
Peter 34 80
SELECT * FROM "Персоны" WHERE "Возраст" >= 34

Проекция (PROJECT A {x, y, …, z})

Персоны

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80

`Pi_("Возраст", "Вес")("Персоны")`

Возраст Вес
29 70
54 54
34 80
SELECT DISTINCT "Возраст", "Вес" FROM "Персоны"

Объединение (A UNION B)

Персоны

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80

Персонажи

Имя Возраст Вес
Daffy 24 19
Donald 29 70
Scrooge 81 27

`"Персоны" uu "Персонажи"`

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80
Daffy 24 19
Scrooge 81 27
SELECT * FROM "Персоны" UNION SELECT * FROM "Персонажи"

Пересечение (A INTERSECT B)

Персоны

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80

Персонажи

Имя Возраст Вес
Daffy 24 19
Donald 29 70
Scrooge 81 27

`"Персоны" nn "Персонажи"`

Имя Возраст Вес
Donald 29 70
SELECT * FROM "Персоны"
NATURAL JOIN "Персонажи"

Разность (A MINUS B)

Персоны

Имя Возраст Вес
Harry 34 80
Donald 29 70
Helena 54 54
Peter 34 80

Персонажи

Имя Возраст Вес
Daffy 24 19
Donald 29 70
Scrooge 81 27

`"Персоны" \\ "Персонажи"`

Имя Возраст Вес
Harry 34 80
Helena 54 54
Peter 34 80
SELECT * FROM "Персоны"
NATURAL LEFT JOIN "Персонажи"
WHERE "Персонажи" IS NULL

Произведение (A TIMES B)

Мультфильмы

Код_Мульта Название_Мульта
1 The Simpsons
2 Family Guy
3 Duck Tales

Каналы

Код_Канала Название_Канала
1 СТС
2 2x2

`"Мультфильмы" xx "Каналы"`

Код_Мульта Название_Мульта Код_Канала Название_Канала
1 The Simpsons 1 СТС
2 Family Guy 1 СТС
3 Duck Tales 1 СТС
1 The Simpsons 2 2x2
2 Family Guy 2 2x2
3 Duck Tales 2 2x2
SELECT * FROM "Персоны", "Персонажи"

Деление (A DIVIDEBY B)

Мультфильмы

Код_Мульта Название_Мульта Название_Канала
1 The Simpsons RenTV
1 The Simpsons 2x2
1 The Simpsons СТС
2 Family Guy RenTV
2 Family Guy 2x2
3 Duck Tales СТС
3 Duck Tales 2x2

Каналы

Название_Канала
RenTV
2x2

`"Мультфильмы" -: "Каналы"`

Код_Мульта Название_Мульта
1 The Simpsons
2 Family Guy
SELECT "Код_Мульта", "Название_Мульта"
FROM "Мультфильмы"
JOIN "Каналы" USING ("Название_Канала")
GROUP BY "Код_Мульта", "Название_Мульта"
HAVING COUNT(DISTINCT "Название_Канала") = (
    SELECT COUNT(DISTINCT "Название_Канала") FROM "Каналы"
)

Соединение ((A TIMES B) WHERE P)

Мультфильмы

Код_Мульта Название_Мульта Название_Канала
1 The Simpsons 2x2
2 Family Guy 2x2
3 Duck Tales RenTV

Каналы

Код_Канала Частота
RenTV 3.1415
2x2 783.25

`"Мультфильмы" ⋈ "Каналы"`

Код_Мульта Название_Мульта Название_Канала Код_Канала Частота
1 The Simpsons 2x2 2x2 783.25
2 Family Guy 2x2 2x2 783.25
3 Duck Tales RenTV RenTV 3.1415
SELECT *
FROM "Мультфильмы"
JOIN "Каналы" ON ("Название_Канала" = "Код_Канала")

SQL

Алехин Владислав
E-mail: v.alehin@corp.mail.ru
Спасибо за внимание!