Разработка динамических сайтов
SEO услуги
Управление контекстной рекламой

Вход на хостинг

Имя пользователя:*

Пароль пользователя:*

IT-новости

20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла

Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......

подробнее

30.07.2015 Ищем уникальный контент для сайта

Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......

подробнее

11.05.2015 Распространённые ошибки разработчиков сайтов

Не секрет, что в сети Интернет насчитывается миллионы сайтов, и каждый день появляются тысячси новых......

подробнее

PostgreSQL: функции и триггеры


Сергей Супрунов

Система управления базами данных PostgreSQL обладает очень мощными средствами, делающими возможным перенос части так называемой бизнес-логики приложения со стороны клиента (по отношению к СУБД) на сторону сервера. При этом сокращается, и порой существенно, трафик между клиентом и сервером, упрощается сопровождение разработанного приложения (сервер один, а клиентов может быть много), повышается надежность в плане целостности данных, в ряде случаев становится проще и сам алгоритм работы приложения.

Данная статья посвящена рассмотрению одного из наиболее эффективных средств – триггеров. Все примеры тестировались на PostgreSQL 7.4.2, работающей на системе FreeBSD 5.2.

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

Итак, пользователь выбрал интересующий его товар и нажал ссылку «Купить». Далее необходимо:

1. Занести в БД информацию о поступлении заказа.

2. Проверить, есть ли необходимое количество товара на складе.

3. Если есть – зарезервировать товар, уменьшив при этом остаток на складе. Если необходимого количества на складе нет, то проверить, не находится ли в резерве нужный товар свыше 5 дней. Если такое имеется и количество товара по просроченным заказам достаточно для исполнения текущего, то просроченные заказы нужно аннулировать, а товар резервировать для нового заказа.

4. При свободном остатке того или иного товара на складе меньше определенного значения сформировать запись в таблице предупреждений.

5. Все «нештатные» ситуации (невозможность зарезервировать требуемое количество, аннулирование неоплаченного заказа) должны отражаться в таблице предупреждений.

Операции выставления счетов, получения оплаты и т. д. для простоты возложим на менеджеров компании. Методы их взаимодействия с базой данных рассматривать в данной статье не будем. Также не будем резервировать товар частично, если необходимого количества не оказалось – пусть этим тоже занимаются менеджеры. Для наглядности алгоритм того, как должно вести себя наше приложение, представлен на рис. 1.

Рисунок 1

Итак, попытаемся решить сформулированные выше задачи без помощи «внешнего» сценария, по одному-единственному запросу к СУБД.

Структура БД для нашей задачи будет следующая:

n  Таблица «Заказы», orders:

n  Идентификатор заказа, order_id, serial.

n  Информация о покупателе, customer, varchar.

n  Идентификатор товара, goods_id, numeric(3).

n  Количество единиц товара, count, numeric(2).

n  Цена товара, по которой делается заказ, price, numeric(7,2).

n  Дата заказа, date, date.

n  Таблица «Товары», goods:

n  Идентификатор товара, goods_id, serial.

n  Описание товара, goods, varchar.

n  Минимальный остаток на складе, rest, numeric(2).

n  Таблица «Склад», warehouse:

n  Идентификатор товара, goods_id, numeric(3).

n  Количество, count, numeric(5).

n  Таблица «Резерв», reserved:


Предыдущая страницаОглавлениеСледующая страница
 
[001] [002] [003] [004] [005] [006] [007] [008] [009] [010] [011] [012] [013] [014] [015] [016] [017] [018] [019] [020]
[021] [022] [023] [024] [025] [026] [027] [028] [029] [030] [031] [032] [033] [034] [035] [036] [037] [038] [039] [040]
[041] [042] [043] [044] [045] [046] [047] [048] [049] [050] [051] [052] [053] [054] [055] [056] [057] [058] [059] [060]
[061] [062] [063] [064] [065] [066] [067] [068] [069] [070] [071] [072] [073] [074] [075] [076] [077] [078] [079] [080]
[081] [082] [083] [084] [085] [086] [087] [088] [089] [090] [091] [092] [093] [094] [095] [096] [097] [098] [099] [100]
[101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120]
[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140]
[141] [142] [143] [144] [145] [146] [147] [148] [149]

+7 (831) 413-63-27
ООО Дельта-Технология ©2007 - 2023 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100