Слайды доступны по адресу: https://3kybika.github.io/technopark-dbms-lectures/
Экзамен ― это уникальная возможность для студента два раза в год узнать что-то полезное хотя бы на несколько дней.
Реляционная база данных Yahoo > 2 петабайт1
Архив с базой данных OpenStreetMap занимает порядка
1.69Тб2
В большинстве вакансий разработчика упоминается SQL, по данным hh.ru
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь.
Допустим, мы реализуем приложение "Поваренная книга" для хранения рецептов.
Все нетривиальные абстракции дырявы.
| Стоимость операции | нс (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 открывал возможности безболезненного перехода от одной СУБД к другой. Хотя воспользовались ими на практике только единицы, мысль о возможной смене поставщика СУБД, не связанной со сколько-нибудь ощутимыми затратами, согревала всех.
| Целое | Строка | Целое | Типы данных | |||
| номер | имя | должность | деньги | Домены | ||
|
Отношение
|
Табельный номер | Имя | Должность | Оклад | Премия | Аттрибуты |
| 2934 | Иванов | Инженер | 112 | 40 | Кортежи | |
| 2935 | Петров | Вед. Инженер | 144 | 50 | ||
| 2936 | Сидоров | Бухгалтер | 92 | 35 | ||
| Ключ | ||||||
Реляционная модель данных включает следующие компоненты:
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Donald | 29 | 70 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
SELECT * FROM "Персоны" WHERE "Возраст" >= 34
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Donald | 29 | 70 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
| Возраст | Вес |
|---|---|
| 29 | 70 |
| 54 | 54 |
| 34 | 80 |
SELECT DISTINCT "Возраст", "Вес" FROM "Персоны"
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Donald | 29 | 70 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
| Имя | Возраст | Вес |
|---|---|---|
| Daffy | 24 | 19 |
| Donald | 29 | 70 |
| Scrooge | 81 | 27 |
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Donald | 29 | 70 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
| Daffy | 24 | 19 |
| Scrooge | 81 | 27 |
SELECT * FROM "Персоны" UNION SELECT * FROM "Персонажи"
| Имя | Возраст | Вес |
|---|---|---|
| Harry | 34 | 80 |
| Donald | 29 | 70 |
| Helena | 54 | 54 |
| Peter | 34 | 80 |
| Имя | Возраст | Вес |
|---|---|---|
| Daffy | 24 | 19 |
| Donald | 29 | 70 |
| Scrooge | 81 | 27 |
| Имя | Возраст | Вес |
|---|---|---|
| Donald | 29 | 70 |
SELECT * FROM "Персоны"
NATURAL JOIN "Персонажи"
| Имя | Возраст | Вес |
|---|---|---|
| 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
| Код_Мульта | Название_Мульта |
|---|---|
| 1 | The Simpsons |
| 2 | Family Guy |
| 3 | Duck Tales |
| Код_Канала | Название_Канала |
|---|---|
| 1 | СТС |
| 2 | 2x2 |
| Код_Мульта | Название_Мульта | Код_Канала | Название_Канала |
|---|---|---|---|
| 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 "Персоны", "Персонажи"
| Код_Мульта | Название_Мульта | Название_Канала |
|---|---|---|
| 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 "Каналы"
)
| Код_Мульта | Название_Мульта | Название_Канала |
|---|---|---|
| 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 ("Название_Канала" = "Код_Канала")