СУБД
Смаль Дмитрий
smal@corp.mail.ru
Как можно хранить данные ?
Какие возникнут проблемы ?
Проблемы и задачи
1) Структура хранения
2) Описание схемы данных
3) Примитивные операции
4) Эффективный поиск по данным
5) Управление памятью
6) Совместный доступ к данным
7) Изоляция и блокировки
8) Надежные (атомарные) операции
Реляционная алгебра
Алгебра = множество + операции над ним
Основные понятия:
– Отношение, relation, таблица
– Кортеж, tuple, строка, запись, элемент
– Аттрибут, столбец, поле
– Запрос = выражение рел. алгебры
Реляционная алгебра работает с множеством
отношений.
Кортежи не упорядочены, аттрибуты не
упорядочены, данные в столбце однотипны.
Операции реляционной алгебры
1) Отбор: удаление части кортежей
2) Проекция: удаление части аттрибутов
3) Декартово произведение: n*m
4) Объединение: при одинаковых аттрибутах
5) Переименование аттрибутов
6) Соединение: произведение, но с
дополнительными условиями.
Hero_id Ability
1 Memory
2 Stop
Bullets
2 Bend
spoons
Id Name
1 Johny
2 Neo
3 Rick
Dekkard
Id Name Hero_id Ability
1 Johny 1 Memory
2 Neo 2 Stop
Bullets
2 Neo 2 Bend
spoons
SQL – язык для работы с СУБД
1) DDL – Data Defenition Language.
Определение структуры отношений
2) DML – Data Manipulation Language.
Изменение хранимых данных.
3) DQL – Data Query Language (select)
Реализация реляционной алгебры.
Вычисления новых отношений. Запросы.
SELECT
Таблица - users(id, name)
SELECT id, name, length(name) AS len
FROM users
WHERE email LIKE '%@mail.ru' AND age > 10
ORDER BY name, 1 DESC
LIMIT 10 OFFSET 15
SELECT - агрегация
SELECT name, count(id) cnt
FROM users
GROUP BY name
ORDER BY cnt
Аггрегатные функции: COUNT, SUM, AVG,
GROUP_CONCAT
Поле – либо в аггрегатной функции, либо в
GROUP BY
Select - соединения
heroes(id, name) abilities(hero_id, ability)
SELECT name, ability
FROM heroes h
INNER JOIN abilities a ON h.id = a.hero_id
SELECT name, ability
FROM heroes h, abilities a
WHERE h.id = a.hero_id
Разновидности join
1) INNER – соединение по условию
2) LEFT OUTER ( A LEFT JOIN B )
- А есть всегда
3) RIGH OUTER ( A RIGHT JOIN B )
- B есть всегда
4) FULL OUTER – есть все кортежи и из A и из
B, но часть из них соединена
Id Name
1 Johny
2 Neo
3 Rick
Dekkard
Hero_id Abitilty
1 Memory
2 Stop bullets
7 Dance
Id Name Hero_id Ability
1 Johny 1 Memory
2 Neo 2 Stop bullets
3 Rick
Dekkard
NULL NULL
Id Name Hero_id Ability
1 Johny 1 Memory
2 Neo 2 Stop bullets
NULL NULL 7 Dance
Вложенные запросы
Таблица players (name, team, age)
SELECT name, team, age
FROM players u
INNER JOIN (
SELECT team, max(age) max_age
FROM players
GROUP BY team
) a
ON u.team = a.team AND u.age = a.max_age
SQL – DML запросы
INSERT INTO users (name, age) VALUES ('petr', 10);
UPDATE users SET age = 10 WHERE name = 'petr';
UPDATE users SET age = age + 1;
DELETE FROM users WHERE name = 'masha';
DELETE FROM users WHERE age > 150;
REPLACE INTO users (name, age) VALUES ('petr', 10);
INSERT INTO users (name, age) VALUES ('petr', 10) ON
DUPLICATE KEY UPDATE name = 'petr', age = 10;
Проектирование базы данных
Проблемы: избыточность, противоречивость
name passport book_id title author
Petr 112233445
5
1 Анна
Каренина
Лев
Толстой
Petr 112233445
5
789 Война и Мир Лев
Толстой
NULL NULL 2 Азбука O'Reily
id name passport
1 Petr 112233445
5
2 Ivan 123456789
0
id title
1 Анна
Каренина
2 Азбука
789 Война и Мир
user_id book_id
1 1
1 789
Как формализовать ?
Ключ – несократимый набор аттрибутов,
обеспечивающий уникальность кортежа.
Нормальные формы – требования к структуре.
1 н.ф.) атомарные значения аттрибутов
2 н.ф.) каждый неключевой аттрибут
функционально зависит от ключа
3 н.ф.) каждая такая зависимость нетранзитивна
4, 5, 6 и т.д.)
Best Practice
1) Здравый смысл – разделять сущности
2) Выделять синтетические PK
3) Связи 1:N, N:1 – внешний ключ
4) Связи N:M – промежуточная таблица
5) Аттрибут с фикс. числом значений –
внешняя таблица (либо enum)
Целосность. Внешние ключи.
Внешний (foreign) ключ – множество
аттрибутов отношения, значения которых
указывают на кортеж другого отношения.
1) В целевой таблицы должен быть ключ
2) При добавлении (изменении) кортежа в
таблицу СУБД проверит, что есть связанной
таблице есть кортеж, на который ссылаются
3) При удаление это кортежа будут удалены
(обнулены) все ссылки на него
DDL – определение схемы
CREATE TABLE users (
idINTEGER UNSIGNED NOT NULL,
email VARCHAR(64) NOT NULL,
name VARCHAR(255) NOT NULL,
birthdate DATE,
registred DATETIME DEFAULT NOW(),
PRIMARY KEY (id),
UNIQUE KEY (email),
KEY birthdate_idx (birthdate)
);
CREATE TABLE users (
idSERIAL,
name VARCHAR(255) NOT NULL,
);
CREATE TABLE cars (
id SERIAL,
number VARCHAR(10) NOT NULL,
owner_id BIGINT NOT NULL,
FOREIGN KEY (owner_id) REFERENCES users (id)
ON DELETE CASCADE
);
DDL – другие команды
DROP TABLE useless;
ALTER TABLE users ADD COLUMN language
enum('ru', 'en') NOT NULL DEFAULT 'ru';
ALTER TABLE users DROP COLUMN langauge;
ALTER TABLE users ADD INDEX ('name');
CREATE DATABASE test;
….
Индексы
1) Уникальные (UNIQUE INDEX) = Ключи
2) Не уникальные
1) B-tree
2) HashTable
3) Пространственные (гео индексы)
4) Full-text
В MySQL KEY и INDEX - синонимы
План выполнения запроса
topics( id, title, txt, created)
comments ( id, txt, created, topic_id)
10 последних комментариев вместе с их темами
SELECT с.id, с.txt, с.created, t.id, t.title, t.txt
FROM topics t, comments c
WHERE t.id = c.topic_id
ORDER BY c.created DESC
LIMIT 10;
EXPLAIN – показать план выполнения запроса
1) Создавать индексы для полей по которым
происходит JOIN
2) Создавать индексы для полей по которым
идет сортировка (ORDER)
3) Проверять план выполнения запроса
4) Использование подсказок (hints):
Принудительное использование индекса
Порядок выполнения JOIN
5) Селективность и кардинальность
Методы оптимизации запросов
ACID
1) Atomicity – атомарность операций
2) Consistency – согласованность
3) Isolation – изоляция клиентов
4) Durability – гарантия сохранения после
успешного завершения операции
Блокировки
1) Row / Page / Table level
2) Read / Write lock
Транзакции
Транзакция – группа изменений данных,
которые либо происходят все вместе либо не
происходят вообще. Rollback. Commit.
Уровни изоляции
1) совместный доступ → Read uncommitted
2) “грязное чтение” → Read committed
3) неповторяющ. запросы → Repeatable read
4) фантомное чтение → Serializable
Обзор СУБД
Домашнее задание
1) http://sql-ex.ru
2) Спроектировать базу данных для хранения
журнала посещения занятий.

Web весна 2012 лекция 5

  • 1.
  • 2.
    Как можно хранитьданные ? Какие возникнут проблемы ?
  • 3.
    Проблемы и задачи 1)Структура хранения 2) Описание схемы данных 3) Примитивные операции 4) Эффективный поиск по данным 5) Управление памятью 6) Совместный доступ к данным 7) Изоляция и блокировки 8) Надежные (атомарные) операции
  • 4.
    Реляционная алгебра Алгебра =множество + операции над ним Основные понятия: – Отношение, relation, таблица – Кортеж, tuple, строка, запись, элемент – Аттрибут, столбец, поле – Запрос = выражение рел. алгебры Реляционная алгебра работает с множеством отношений.
  • 5.
    Кортежи не упорядочены,аттрибуты не упорядочены, данные в столбце однотипны.
  • 6.
    Операции реляционной алгебры 1)Отбор: удаление части кортежей 2) Проекция: удаление части аттрибутов 3) Декартово произведение: n*m 4) Объединение: при одинаковых аттрибутах 5) Переименование аттрибутов 6) Соединение: произведение, но с дополнительными условиями.
  • 7.
    Hero_id Ability 1 Memory 2Stop Bullets 2 Bend spoons Id Name 1 Johny 2 Neo 3 Rick Dekkard Id Name Hero_id Ability 1 Johny 1 Memory 2 Neo 2 Stop Bullets 2 Neo 2 Bend spoons
  • 8.
    SQL – языкдля работы с СУБД 1) DDL – Data Defenition Language. Определение структуры отношений 2) DML – Data Manipulation Language. Изменение хранимых данных. 3) DQL – Data Query Language (select) Реализация реляционной алгебры. Вычисления новых отношений. Запросы.
  • 9.
    SELECT Таблица - users(id,name) SELECT id, name, length(name) AS len FROM users WHERE email LIKE '%@mail.ru' AND age > 10 ORDER BY name, 1 DESC LIMIT 10 OFFSET 15
  • 10.
    SELECT - агрегация SELECTname, count(id) cnt FROM users GROUP BY name ORDER BY cnt Аггрегатные функции: COUNT, SUM, AVG, GROUP_CONCAT Поле – либо в аггрегатной функции, либо в GROUP BY
  • 11.
    Select - соединения heroes(id,name) abilities(hero_id, ability) SELECT name, ability FROM heroes h INNER JOIN abilities a ON h.id = a.hero_id SELECT name, ability FROM heroes h, abilities a WHERE h.id = a.hero_id
  • 12.
    Разновидности join 1) INNER– соединение по условию 2) LEFT OUTER ( A LEFT JOIN B ) - А есть всегда 3) RIGH OUTER ( A RIGHT JOIN B ) - B есть всегда 4) FULL OUTER – есть все кортежи и из A и из B, но часть из них соединена
  • 13.
    Id Name 1 Johny 2Neo 3 Rick Dekkard Hero_id Abitilty 1 Memory 2 Stop bullets 7 Dance Id Name Hero_id Ability 1 Johny 1 Memory 2 Neo 2 Stop bullets 3 Rick Dekkard NULL NULL Id Name Hero_id Ability 1 Johny 1 Memory 2 Neo 2 Stop bullets NULL NULL 7 Dance
  • 14.
    Вложенные запросы Таблица players(name, team, age) SELECT name, team, age FROM players u INNER JOIN ( SELECT team, max(age) max_age FROM players GROUP BY team ) a ON u.team = a.team AND u.age = a.max_age
  • 15.
    SQL – DMLзапросы INSERT INTO users (name, age) VALUES ('petr', 10); UPDATE users SET age = 10 WHERE name = 'petr'; UPDATE users SET age = age + 1; DELETE FROM users WHERE name = 'masha'; DELETE FROM users WHERE age > 150; REPLACE INTO users (name, age) VALUES ('petr', 10); INSERT INTO users (name, age) VALUES ('petr', 10) ON DUPLICATE KEY UPDATE name = 'petr', age = 10;
  • 16.
    Проектирование базы данных Проблемы:избыточность, противоречивость name passport book_id title author Petr 112233445 5 1 Анна Каренина Лев Толстой Petr 112233445 5 789 Война и Мир Лев Толстой NULL NULL 2 Азбука O'Reily id name passport 1 Petr 112233445 5 2 Ivan 123456789 0 id title 1 Анна Каренина 2 Азбука 789 Война и Мир user_id book_id 1 1 1 789
  • 17.
    Как формализовать ? Ключ– несократимый набор аттрибутов, обеспечивающий уникальность кортежа. Нормальные формы – требования к структуре. 1 н.ф.) атомарные значения аттрибутов 2 н.ф.) каждый неключевой аттрибут функционально зависит от ключа 3 н.ф.) каждая такая зависимость нетранзитивна 4, 5, 6 и т.д.)
  • 18.
    Best Practice 1) Здравыйсмысл – разделять сущности 2) Выделять синтетические PK 3) Связи 1:N, N:1 – внешний ключ 4) Связи N:M – промежуточная таблица 5) Аттрибут с фикс. числом значений – внешняя таблица (либо enum)
  • 19.
    Целосность. Внешние ключи. Внешний(foreign) ключ – множество аттрибутов отношения, значения которых указывают на кортеж другого отношения. 1) В целевой таблицы должен быть ключ 2) При добавлении (изменении) кортежа в таблицу СУБД проверит, что есть связанной таблице есть кортеж, на который ссылаются 3) При удаление это кортежа будут удалены (обнулены) все ссылки на него
  • 20.
    DDL – определениесхемы CREATE TABLE users ( idINTEGER UNSIGNED NOT NULL, email VARCHAR(64) NOT NULL, name VARCHAR(255) NOT NULL, birthdate DATE, registred DATETIME DEFAULT NOW(), PRIMARY KEY (id), UNIQUE KEY (email), KEY birthdate_idx (birthdate) );
  • 21.
    CREATE TABLE users( idSERIAL, name VARCHAR(255) NOT NULL, ); CREATE TABLE cars ( id SERIAL, number VARCHAR(10) NOT NULL, owner_id BIGINT NOT NULL, FOREIGN KEY (owner_id) REFERENCES users (id) ON DELETE CASCADE );
  • 22.
    DDL – другиекоманды DROP TABLE useless; ALTER TABLE users ADD COLUMN language enum('ru', 'en') NOT NULL DEFAULT 'ru'; ALTER TABLE users DROP COLUMN langauge; ALTER TABLE users ADD INDEX ('name'); CREATE DATABASE test; ….
  • 23.
    Индексы 1) Уникальные (UNIQUEINDEX) = Ключи 2) Не уникальные 1) B-tree 2) HashTable 3) Пространственные (гео индексы) 4) Full-text В MySQL KEY и INDEX - синонимы
  • 24.
    План выполнения запроса topics(id, title, txt, created) comments ( id, txt, created, topic_id) 10 последних комментариев вместе с их темами SELECT с.id, с.txt, с.created, t.id, t.title, t.txt FROM topics t, comments c WHERE t.id = c.topic_id ORDER BY c.created DESC LIMIT 10; EXPLAIN – показать план выполнения запроса
  • 25.
    1) Создавать индексыдля полей по которым происходит JOIN 2) Создавать индексы для полей по которым идет сортировка (ORDER) 3) Проверять план выполнения запроса 4) Использование подсказок (hints): Принудительное использование индекса Порядок выполнения JOIN 5) Селективность и кардинальность Методы оптимизации запросов
  • 26.
    ACID 1) Atomicity –атомарность операций 2) Consistency – согласованность 3) Isolation – изоляция клиентов 4) Durability – гарантия сохранения после успешного завершения операции Блокировки 1) Row / Page / Table level 2) Read / Write lock
  • 27.
    Транзакции Транзакция – группаизменений данных, которые либо происходят все вместе либо не происходят вообще. Rollback. Commit. Уровни изоляции 1) совместный доступ → Read uncommitted 2) “грязное чтение” → Read committed 3) неповторяющ. запросы → Repeatable read 4) фантомное чтение → Serializable
  • 28.
  • 29.
    Домашнее задание 1) http://sql-ex.ru 2)Спроектировать базу данных для хранения журнала посещения занятий.