- Оглавление
- Транзакции
- ACID
- Индексы
- Блокировки
- ORM
- NoSQL
- Реляционные базы данных
- Нормальная форма
- Основные элементы яызка SQL
- Агрегатные функции
- Тригеры
- Общее:
- Транзакции: Последовательность из нескольких запросов, которые либо выполняются целиком и успешно, соблюдая целостность данных, либо не выполняются вовсе.
- Проблемы выполнения параллельных транзакций:
- Lost Update - при изменении одного блока данных разными транзакциями, теряются все данные, кроме последнего записаного.
- Dirty Read - чтение данных, измененных транзакцией, которая в последствии не подтвердится (откат транзакции).
- Non-Repeatable Read - при одинаковом запросе в рамках одной транзакции, данные могут быть изменены другой транзакцией.
- Phantom Reads - при одинаковом запросе в рамках одной транзакции, другая транзакция может добавить новые данные.
- Уровни изоляции транзакций:
- Read uncommitted - параллельно исполняющиеся транзакции видят все изменения другой транзакации.
- Read committed - пишущая транзакция блокирует изменяемые данные для читающих транзакций, до своего завершения. Читающая транзакция освобождает данные, по завершению чтения, поэтому при повторном чтении, данные могут быть изменены (Non-Repeatable Read).
- Repeatable read - транзакция блокирует изменения читаемых данных, до своего завершения. При этом другие транзакции могут вставлять новые строки, что приводит к фантомным чтениям.
- Serializable - транзакции полностью изолированы, блокируется запись, чтение и вставка любых данных, которые отвечают условию транзакции.
- Синтаксис:
- В PostgreSQL это блок запросов начинающийся с запроса BEGIN и заканчивающийся запросом COMMIT. Любая ошибка внутри транзакции откатит изменения, которые были сделаны после запроса BEGIN. При необходимости можно откатить изменения самостоятельно выполнив ROLLBACK до COMMIT.
- Проблемы выполнения параллельных транзакций:
- ACID: Гарантии, которая должна давать база данных, чтобы поддерживать транзакции. Без деталий реализации.
- Atomicity (Атомарность) - атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния. Например, при банковском переводе, если какая-либо транзакция произведёт списание, но не произведёт зачисления, то система останется в некорректном состоянии и свойство согласованности будет нарушено.
- Consistency (Согласованность) - каждая успешная транзакция, фиксирует только допустимые данные. Это свойство соблюдается программистами, при написании кода транзакции.
- Isolation (Изолированность) - во время выполнения транзакции, параллельные транзакции не должны оказывать влияния на её результат.
- Durability (Надежность) - если транзакция завершена, то независимо от какого-либо сбоя, эти изменения не будут отменены. Данные сохраняются в энергонезависимую память.
- Индексы: это специальная структура внутри базы данных, создаваемая для ускорения поиска. Представляет собой сбалансированное дерево (btree)
- Транзакции: Последовательность из нескольких запросов, которые либо выполняются целиком и успешно, соблюдая целостность данных, либо не выполняются вовсе.
- Реляционные базы данных: представляет собой набор таблиц (сущностей). Таблицы состоят из колонок и строк (кортежей). Между таблицами существуют отношения, которые формируются с помощью ключей (первичных и вторичных).
- Ключи (Первичные, вторичные):
- Первичный клююч - это поле или набор полей, которое содержит уникальное значение для каждой записи.
- Внешний ключ (foreign key) - поле, которое связывает зависимую и подчиненную таблицу, указывая на один из столбцов главной таблицы, например на первичный ключ из главной таблицы.
- Первая нормальная форма:
- Каждая ячейка таблицы может хранить только одно значение
- Все данные в одной колонке могут быть только одного типа
- Каждая запись в таблице должна однозначно отличаться от других записей
- Вторая нормальная форма:
- Таблица должна быть в первой нормальной форме
- Все атрибуты (не ключевые) таблицы должны зависеть от первичного ключа
- Третья нормальная форма:
- Таблица должна быть во второй нормальной форме
- Все колонки в таблице зависят от первичного ключа и не зависят друг от друга
- Виды связей:
- Один ко многим -
- Один к одному -
- Многие ко многим -
- Ключи (Первичные, вторичные):
- Блокировки:
- ORM:
- NoSQL:
- Основные элементы яызка SQL:
- Агрегатные функции:
- COUNT() - считает количество записей в выборке. SELECT COUNT(*) FROM users
- Когда аргументом функции является *, она считает количество строк.
- Если в неё передать имя конкретного поля, то она посчитает количество строк, в которых это поле НЕ равно NULL.
- MAX/MIN - функции MAX и MIN позволяют находить максимальное и минимальное значение. SELECT MAX(birthday) FROM users WHERE gender = 'male'
- SUM - сумма всех значений. SELECT SUM(amount) FROM orders WHERE created_at BETWEEN '2016-01-01' AND '2016-12-31'
- AVG - среднее арифметическое всех значений. SELECT AVG(amount) FROM orders WHERE created_at BETWEEN '2016-01-01' AND '2016-12-31'
- COUNT() - считает количество записей в выборке. SELECT COUNT(*) FROM users
- INSERT - вставка данных в таблицу. INSERT INTO courses (name, slug) VALUES ('Bash', 'bash')
- UPDATE - обновление записей в таблице, в части где SET описывается какое значение установить в какое поле. UPDATE courses SET body = 'updated!' WHERE slug = 'bash'
- DELETE - удаление данных из таблицы. DELETE FROM courses WHERE slug = 'bash';
- TRUNCATE - предназначен для полной очистки таблицы, не описан в стандарте, но реализован в большинстве СУБД. TRUNCATE courses
- SELECT - выборка данных из таблицы. SELECT * FROM users
- ALTER - изменение структуры таблицы. ALTER TABLE users ADD COLUMN age int
- ADD - добавление столбца.
- RENAME - переименование столбца.
- DROP - удаление столбца.
- ORDER BY - отсортировать по возрастанию (ASC) или убыванию (DESC), например SELECT * FROM users ORDER BY created_at ASC. NULL считается больше любого значения, чтобы избежать этого можно добавить флаг NULLS FIRST/LAST
- WHERE - логическое условие, например SELECT * FROM users WHERE id != 3.
- Для диапазонов используется BETWEEN - SELECT * FROM users WHERE created_at BETWEEN '2018-01-01' AND '2018-10-05'
- Для поиска значения, которое соответсвует одному значению из набора используется IN - SELECT * FROM users WHERE id IN (1, 2, 5)
- Для поиска с частичным совпадением используется LIKE - SELECT * FROM users WHERE first_name LIKE 'A%'
- LIMIT и OFFSET - позволяет брать определенный набор записей из таблицы, например 10 записей, начиная с 11 - SELECT * FROM users ORDER BY id LIMIT 10
- DISTINCT - SELECT DISTINCT first_name FROM users. Убирает все дублирующие строки из результирующего набора.
- DISTINCT ON -
- GROUP BY -
- HAVING -
- JOIN -
- INNER JOIN - в выборку попадают только те записи, для которых есть соответствие в таблице после ключевого слова JOIN.
- LEFT JOIN - берет все данные из одной таблицы и присоединяет к ним данные из другой, если они присутствуют, иначе заполняет их NULL
- RIGHT JOIN - обратно LEFT JOIN
- Агрегатные функции:
- Тригеры:
- Репликация:
- Шардирование: