Реализация элементов логики приложения в MySQL: триггеры, хранимые процедуры, кэширование

Содержание

Слайд 2

Когда нужны триггеры? Пример 1, складской учет методом FIFO (First In First Out)

Товар,

Когда нужны триггеры? Пример 1, складской учет методом FIFO (First In First
пришедший на склад первым, первым уходит со склада.

Пришло: 1 единица товара по 5 рублей
Пришло: 2 единицы товара по 10 рублей
Продано: 2 единицы товара по 15 рублей
Каков наш доход от продажи?
Неверно: 15 * 2 – 10 * 2 = 10 рублей
Верно: (5 * 1 + 10 * 1) – 10 * 2 = 5 рублей

Слайд 3

Складской учет: схема процесса

Склад 1

Склад 2

поставка

поставка

возврат
поставщику

продажа

продажа

возврат
от покупателя

перемещение

списание

Складской учет: схема процесса Склад 1 Склад 2 поставка поставка возврат поставщику

Слайд 4

Документы складского учета

Как узнать остаток товара???

Список товаров

Товар Цена Количество

Список товаров

Товар Цена

Документы складского учета Как узнать остаток товара??? Список товаров Товар Цена Количество
Количество

Список товаров

Товар Количество

Слайд 5

Суммирование по спискам товаров из разных документов не подойдет:

Много однотипных запросов к

Суммирование по спискам товаров из разных документов не подойдет: Много однотипных запросов
разным таблицам;

Придется многое переписывать при добавлении новых типов документов;

Операции получения остатка выполняются постоянно, а такой набор запросов будет выполняться довольно медленно;

Хранить промежуточные остатки плохо, потому что данные часто меняются «задним числом».

Слайд 6

Решение: создаем реестр операций складского учета

Решение: создаем реестр операций складского учета

Слайд 7

Реестр операций складского учета

поставка

Реестр операций складского учета поставка

Слайд 8

Реестр операций складского учета

поставка

Реестр операций складского учета поставка

Слайд 9

Реестр операций складского учета

поставка

продажа

Реестр операций складского учета поставка продажа

Слайд 10

Реестр операций складского учета

поставка

продажа

Как поддерживать актуальность данных в реестре?

Реестр операций складского учета поставка продажа Как поддерживать актуальность данных в реестре?

Слайд 11

База данных

Программа складского учета

Бухгалтерская
программа

Кассовый
аппарат

Другие
программные
продукты

База данных Программа складского учета Бухгалтерская программа Кассовый аппарат Другие программные продукты

Слайд 12

Триггеры для построения реестра

Триггеры для построения реестра

Слайд 13

Триггеры для построения реестра

поставка

Триггеры для построения реестра поставка

Слайд 14

Триггеры для построения реестра

поставка

Триггер

Триггеры для построения реестра поставка Триггер

Слайд 15

Триггеры для построения реестра

поставка

Триггеры для построения реестра поставка

Слайд 16

Триггеры для построения реестра

поставка

Триггеры для построения реестра поставка

Слайд 17

Триггеры для построения реестра

поставка

Триггер

Триггеры для построения реестра поставка Триггер

Слайд 18

Триггеры для построения реестра

поставка

Триггеры для построения реестра поставка

Слайд 19

Триггеры для построения реестра

поставка

Нужна процедура полного или частичного пересчета реестра!

Триггеры для построения реестра поставка Нужна процедура полного или частичного пересчета реестра!

Слайд 20

Хранимые функции

getGoodsRemainder (товар, дата, склад)
- возвращает остаток товара на заданную

Хранимые функции getGoodsRemainder (товар, дата, склад) - возвращает остаток товара на заданную
дату на конкретном складе
getSaleIncome (продажа)
– доход от одной конкретной продажи
getGoodsIncome (товар, склад, период)
– доход, полученный от реализации конкретного товара за указанный
период
getSelfCost (товар, склад, период)
– себестоимость партии товара, приобретенной за указанный период

Слайд 21

Оценим решение?

Плюсы:
+ все работает очень быстро!
+ легко добавлять новые типы

Оценим решение? Плюсы: + все работает очень быстро! + легко добавлять новые
документов;
+ сторонние приложения могут добавлять/удалять документы, не заботясь о реестре складского учета;
+ для выполнения часто требуемых операций создан удобный набор хранимых процедур.

Слайд 22

Оценим решение?

Минусы:
- данные о каждом перемещении хранятся в базе дважды;
-

Оценим решение? Минусы: - данные о каждом перемещении хранятся в базе дважды;
при создании этой системы пришлось много думать ☺

Слайд 23

Когда нужны триггеры? Пример 2, права доступа и построение списка записей

Список клиентов

Список пользователей

Настраиваемые правила

Когда нужны триггеры? Пример 2, права доступа и построение списка записей Список
доступа

Права пользователя X на клиента Y

Слайд 24

Задача: Показать пользователю список клиентов с постраничной навигацией

Для этого надо:

1. Получить общее

Задача: Показать пользователю список клиентов с постраничной навигацией Для этого надо: 1.
число клиентов,
доступных пользователю;

2. Выстроить их в определенном порядке;

3. Рассчитать номера клиентов,
которые окажутся на определенной странице.

Слайд 25

Как реализуем? Вариант 1

Создать в PHP функцию
GetRights (user, record, module), которая:

А)

Как реализуем? Вариант 1 Создать в PHP функцию GetRights (user, record, module),
Построит список правил, применимых в данном случае,

Б) По каждому правилу сформулирует условие и проверит его выполнение,

В) Выберет минимальный результат из всех, которые дают правила.

Слайд 26

Оценим? Вариант 1

+ Для определения доступа к одной записи –
просто

Оценим? Вариант 1 + Для определения доступа к одной записи – просто
и надежно.

С большим списком записей будет работать очень медленно, даже если кэшировать результат шага А
(список применимых правил).

Можем работать только со списками в сотни записей.

Слайд 27

Как реализуем? Вариант 2

Кэшировать результат расчета прав в БД.
Пересчитывать фрагмент кэша

Как реализуем? Вариант 2 Кэшировать результат расчета прав в БД. Пересчитывать фрагмент
из PHP каждый раз при изменении правил, свойств пользователя, свойств записи.

+ Выборка из кэша будет работать очень быстро.
- Кэш будет пересчитываться очень медленно, особенно после выполнения операций с группами записей.

Можем работать со списками в тысячи записей.

Слайд 28

Как реализуем? Вариант 3

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

Как реализуем? Вариант 3 Создадим хранимую функцию, которая будет вычислять и возвращать
доступа для любой пары пользователь-клиент.
А) Текст функции генерируем из PHP при изменении правил доступа,
Б) Функцию можно включить в SQL-запрос как условие:
SELECT * FROM clients WHERE GetAccess(clients.id,users.id)>0

Слайд 29

Оценим? Вариант 3

+ Быстрее, чем считать права в PHP.

Сложная генерация синтаксиса функции.
С

Оценим? Вариант 3 + Быстрее, чем считать права в PHP. Сложная генерация
большими списками все равно работает медленно.

Можем работать со списками в тысячи записей

Слайд 30

Как реализуем? Вариант 4

Объединим варианты 2 и 3.

А) Реализуем специальную таблицу –

Как реализуем? Вариант 4 Объединим варианты 2 и 3. А) Реализуем специальную
кэш в БД.

Б) Заполнять ее будем при помощи хранимой функции.

В) Вызывать пересчет кэша будем при помощи триггеров на таблицах «клиенты» и «пользователи».

Г) Триггеры перегенерируем при изменении правил. Триггеры ставят фрагменты кэша в очередь на пересчет
при изменении свойств клиента и пользователя.

Д) Хранимая функция создается в момент пересчета.

Слайд 31

Схема базы данных

Очередь

Клиент

Пользователь

Кэш

Клиент

Пользователь

Эффективные права

Триггеры

Триггеры

Асинхронная
процедура
расчета прав

Изменение правил

Генерирует хранимую функцию

Очистка кэша

Схема базы данных Очередь Клиент Пользователь Кэш Клиент Пользователь Эффективные права Триггеры

Слайд 32

Оценим? Вариант 4

+ Очень быстро!

Сложная генерация синтаксиса функции.
Иногда права вычисляются не сразу.

Можем

Оценим? Вариант 4 + Очень быстро! Сложная генерация синтаксиса функции. Иногда права
работать со списками в сотни тысяч записей.

Слайд 33

Как реализуем? Вариант 5

Усовершенствуем механизм.

А) Не будем хранить в кэше нулевые значения.

Б)

Как реализуем? Вариант 5 Усовершенствуем механизм. А) Не будем хранить в кэше
Не будем создавать кэш, если правила не зависят от свойств клиента и пользователя.

Г) Создадим удобные функции для работы с правами из PHP.

Слайд 34

Оценим? Вариант 5

+ Еще быстрее!

Усложнился PHP-код системы прав доступа.

Можем работать со списками

Оценим? Вариант 5 + Еще быстрее! Усложнился PHP-код системы прав доступа. Можем
в сотни тысяч записей.

Слайд 35

Результаты

Обеспечена работоспособность списка записей, содержащего сотни тысяч значений.

Сохранена гибкость системы – администратор

Результаты Обеспечена работоспособность списка записей, содержащего сотни тысяч значений. Сохранена гибкость системы
имеет возможность создавать любые правила доступа, зависящие от свойств клиента и пользователя.

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

Слайд 36

Выводы!

1. При помощи MySQL можно решать сложные вычислительные задачи, возникающие при создании

Выводы! 1. При помощи MySQL можно решать сложные вычислительные задачи, возникающие при
бизнес-приложений.

2. Создание массивов избыточных данных (кэшей) в базе способно увеличить скорость работы приложения в сотни или тысячи раз.

3. Наиболее естественный и удобный способ формирования кэшей в базе данных состоит в использовании триггеров и хранимых процедур.

Любите триггеры и хранимые процедуры! ☺

Имя файла: Реализация-элементов-логики-приложения-в-MySQL:-триггеры,-хранимые-процедуры,-кэширование.pptx
Количество просмотров: 312
Количество скачиваний: 0