Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2019, 13:12   #1
Korban
Пользователь
 
Регистрация: 02.11.2016
Сообщений: 26
По умолчанию Добавление нового заказа в высоконагруженную систему MySQL

Здравствуйте, необходима помощь с высоконагруженным запросом.

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

При составлении SQL-запроса необходимо учесть следующее:

- для занесения данных в корзину заказа (shopping_cart) необходимы значения внешних ключей (fk_order и fk_product);

- существует проблема получения значения id_order, в случае занесения данных заказа в таблицу Order. Она обусловлена ​​тем, что за время от занесения данных заказа до наполнения корзины, в высоконагруженной системе уже могли быть оформлены другие заказы;

- существует проблема добавления товаров (fk_product) в корзину заказа (shopping_cart). Перед добавлением товара в корзину, необходимо проверить, превышает ли количество (shop_quantity) заказанного товара в корзине его количество (quantity) на складе. Если нет, то количество товара на складе необходимо уменьшить на количество в корзине. Однако, за время наполнения корзины в высоконагруженной системе уже могли быть оформлены другие заказы на этот товар. То есть текущее значение количества товара в корзине и на складе (shop_quantity и quantity) может оказаться не актуальным (недействительным).

Таблица "Order":
Код:
CREATE TABLE IF NOT EXISTS `MyDB_Inno_DB`.`Order`
(
`id_order` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`fk_client` INT UNSIGNED NOT NULL,
`fk_delivery` INT UNSIGNED NULL,
`date` DATE NOT NULL,
`st_initiate` BIT(1) NOT NULL,
`st_executed` BIT(1) NOT NULL,
`address` TEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL,
`delivery_price` FLOAT(6,2) NULL,
`delivery_date` DATE NULL,
`delivery_time` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL,
`delivery_phone` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL,
PRIMARY KEY (`id_order`),
INDEX `fk_Order_Client_id_name` (`fk_client` ASC),
INDEX `fk_Order_Delivery_id_name` (`fk_delivery` ASC),
CONSTRAINT `fk_Order_Client_name` FOREIGN KEY (`fk_client`)
REFERENCES `MyDB_InnoDB`.`Client` (`id_client`)
ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_Order_Delivery_name` FOREIGN KEY (`fk_delivery`)
REFERENCES `MyDB_InnoDB`.`Delivery` (`id_delivery`)
ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
Таблица "Shopping_Cart":
Код:
CREATE TABLE IF NOT EXISTS `MyDB_InnoDB`.`Shopping_Cart`
(
`fk_order` INT UNSIGNED NOT NULL DEFAULT 0,
`fk_product` INT UNSIGNED NOT NULL DEFAULT 0,
`shop_quantity` INT NOT NULL,
PRIMARY KEY (`fk_order`, `fk_product`),
INDEX `fk_Shopping_Cart_Order_id_name` (`fk_order` ASC),
INDEX `fk_Shopping_Cart_Products_id_name` (`fk_product` ASC),
CONSTRAINT `fk_Shopping_Cart_Order_name` FOREIGN KEY (`fk_order`)
REFERENCES `MyDB_InnoDB`.`Order` (`id_order`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_Shopping_Cart_Products_name` FOREIGN KEY (`fk_product`)
REFERENCES `MyDB_InnoDB`.`Products` (`id_product`)
ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
Таблица "Products":
Код:
CREATE TABLE IF NOT EXISTS `MyDB_InnoDB`.`Products`
(
`id_product` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`fk_catalog` INT UNSIGNED NOT NULL DEFAULT 0,
`product_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`release_date` DATE NOT NULL,
`price` FLOAT(6,2) NOT NULL,
`quantity` INT NOT NULL,
`description` TEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
PRIMARY KEY (`id_product`),
INDEX `fk_Products_Catalog_id_name` (`fk_catalog` ASC),
CONSTRAINT `fk_Products_Catalog_name` FOREIGN KEY (`fk_catalog`)
REFERENCES `MyDB_InnoDB`.`Catalog` (`id_catalog`)
ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
Как я это понимаю:

1) сначала добавляется запись о новом заказе в таблицу "Order" (id_order, fk_client, date);

2) далее идёт заполнение корзины, таблица "Shopping_Cart" (fk_order, fk_product, shop_quantity), также перед добавлением товара мы проверяем условия: превышает ли количество (shop_quantity) заказанного товара в корзине его количество (quantity) на складе и если нет, то количество товара на складе необходимо уменьшить на количество в корзине.

При этом не понятно как в одном запросе произвести вставку сразу в 2 таблицы (Order, Shopping_Cart) и как выполнить следующие условия:

1) При этом существует проблема получения значения id_order, в случае занесения данных заказа в таблицу Order. Она обусловлена ​​тем, что за время от занесения данных заказа до наполнения корзины, в высоконагруженной системе уже могли быть оформлены другие заказы.

2) Однако, за время наполнения корзины в высоконагруженной системе уже могли быть оформлены другие заказы на этот товар. То есть текущее значение количества товара в корзине и на складе (shop_quantity и quantity) может оказаться не актуальным (недействительным).
Korban вне форума Ответить с цитированием
Старый 03.12.2019, 21:26   #2
weatherbad
Заблокирован
 
Регистрация: 29.11.2019
Сообщений: 5
По умолчанию

LAST_INSERT_ID, явное управление транзакциями. триггер на обновление Products
weatherbad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление нового пользователя Shatten Общие вопросы .NET 1 28.05.2015 17:29
Добавление нового элемента Вероника99 Помощь студентам 7 24.12.2013 17:12
Добавление нового ресурса в exe шник MVX Помощь студентам 19 06.08.2010 11:19
Добавление нового шрифта Alex2009 Общие вопросы Delphi 1 24.04.2010 13:46
добавление нового типа данных Sparky Помощь студентам 10 07.04.2010 11:10