Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников / 6 сообщений из 6, страница 1 из 1
09.01.2017, 02:36
    #39380619
Death_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Добрый день.

Приходит прайс в XML (точнее куча файлов по 100 записей (пока что, но будет где-то по 1000). Имеем такие данные: ИД (он же штрихкод), ИД категории товара (конфеты, фрукты, ...), Наименование, Количество, ИД единицы измерения (шт., гр., кг., ...), Цена, другая информация (много полей, в т.ч. с значениями со справочников). Категории товара и Единицы измерения приходят отдельным файлом. Это все "добро" нужно раскинуть в три таблицы (товары(catalog), Категории товаров(kategor) и Единицы измерения(ediz), по такому критерию - если такого товара еще нету в базе, то его нужно добавить, а если есть - обновить цену; то же самое с категориями и единицами измерения, но только нужно еще получить их ИД для подстановки при вставке записи о товаре.
Самый простой вариант реализации (по записям):
1. Запрос на получение ИД категории товара.
2. Если пустой, тогда запрос на добавление категории + Получение ИД.
3. Получение ИД единицы измерения,
4. Если пустой - вставка + Получение ИД.
...
n. Запрос на получение ИД товара
n+1. Если пустой, то вставка, если не пустой - обновление.
Можно еще сначала обновить все справочники, а потом пускать использовать подзапросы при вставке товаров. Но все это как-то громоздко и кажется мне не по феншую (к примеру применение ON DUPLICATE KEY UPDATE влечет за собой увеличение счетчика автоинкремента даже при обновлении записи).
Собственно интересует механизм уменьшения запросов к БД без увеличения нагрузки. Примеры приветствуются
...
Рейтинг: 0 / 0
09.01.2017, 07:52
    #39380643
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Death_RЕсли пустой, тогда запрос на добавление ... + получение ИД.
INSERT ... ON DUPLICATE KEY UPDATE ...
и затем
SELECT ...

Death_Rприменение ON DUPLICATE KEY UPDATE влечет за собой увеличение счетчика автоинкремента даже при обновлении записи
И что?

Death_RСамый простой вариант реализации (по записям)
Но не самый правильный. Правильнее - всё грузишь во временную таблицу, а потом раскидываешь - одним запросом всё в одну таблицу, потом всё в другую и всё в третью. Суммарно получится 4 запроса, и неважно, сколько записей.

Death_RПримеры приветствуются
Тест-набор в студию.
...
Рейтинг: 0 / 0
09.01.2017, 17:34
    #39380983
Death_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
AkinaПравильнее - всё грузишь во временную таблицу, а потом раскидываешь - одним запросом всё в одну таблицу, потом всё в другую и всё в третью. Суммарно получится 4 запроса, и неважно, сколько записей.Не совсем понял о "все в одну временную таблицу" (Таблица kategor: ID (autoincrement), kname, describe, ID_kimport; Таблица ediz: ID(autoincrement), iname, ID_iimport; Таблица catalog: ID(autoincrement), ID_sk(штрихкод), ID_kategor, cname, kol, ID_ediz, price)?? И как потом раскинуть это все одним запросом в одну таблицу, ... ?
AkinaТест-набор в студию.пока идет проектирование, поэтому тестовых данных нету.
...
Рейтинг: 0 / 0
09.01.2017, 20:18
    #39381077
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Да минимальную модель собери - DDL трёх таблиц, CSV на десяток записей и желаемый итог раскладки его по таблицам с пояснениями, почему так. На 10 минут делов-то, включая перекур... тебе же принцип нужен, а не отлизанный код?
...
Рейтинг: 0 / 0
09.01.2017, 20:19
    #39381078
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Пардон, XML на десяток записей.
...
Рейтинг: 0 / 0
09.01.2017, 23:42
    #39381149
Death_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?xml version="1.0" encoding="UTF-8"?>
<prices>
	<tovar idimp="15e9b8c48d">
		<name>Пиво Жигулевское</name>
		<kategor idimp="bgr07ed95">Алкогольные напитки</kategor>
		<edizm idimp="f93e1128c83a">Ящик</edizm>
		<col>5</col>
		<price>240.5</price>
	</tovar>
	<tovar idimp="65lc8we24s">
		<name>Груши</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="f93e1128c83a">ящик</edizm>
		<col>3</col>
		<price>1055.47</price>
	</tovar>
	<tovar idimp="dys51te3z89v">
		<name>Ананас</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="dskut7fd2d">шт.</edizm>
		<col>5</col>
		<price>195.7</price>
	</tovar>
	<tovar idimp="k8eg5r6t5">
		<name>Топор</name>
		<kategor>Инструменты</kategor>
		<edizm idimp="dskut7fd2d">шт.</edizm>
		<col>10</col>
		<price>159.99</price>
	</tovar>
	<tovar idimp="lekrw6kdr">
		<name>Яблоки красные</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="zve5sr0ht6">кг</edizm>
		<col>50</col>
		<price>55.2</price>
	</tovar>
</prices>



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE DATABASE `test`;

USE `test`;

CREATE TABLE `kategor` ( `id` INT NOT NULL AUTO_INCREMENT , `kname` VARCHAR(70) NOT NULL , `descr` VARCHAR(155) NULL , `id_kimport` VARCHAR(15) NULL , PRIMARY KEY (`id`), INDEX `kname` (`kname`)) ENGINE = InnoDB;

CREATE TABLE `ediz` ( `id` INT NOT NULL AUTO_INCREMENT , `iname` VARCHAR(10) NOT NULL , `id_iimport` VARCHAR(15) NULL , PRIMARY KEY (`id`), INDEX `iname` (`iname`)) ENGINE = InnoDB;

CREATE TABLE `catalog` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `id_kategor` INT NOT NULL , `cname` VARCHAR(150) NOT NULL , `kol` INT NOT NULL DEFAULT '0' , `id_ediz` INT NOT NULL , `price` DECIMAL(15.2) NOT NULL,
`id_cimport` VARCHAR(15) NULL, DEFAULT '0' , PRIMARY KEY (`id`), INDEX `indName` (`cname`)) ENGINE = InnoDB;

INSERT INTO `test`.`ediz` (`id`, `iname`, `id_iimport`) VALUES (NULL, 'шт.', 'dskut7fd2d');
INSERT INTO `kategor` (`id`, `kname`, `descr`, `id_kimport`) VALUES (NULL, 'Фрукты', NULL, 'fd512dfser3');
INSERT INTO `test`.`catalog` (`id`, `id_kategor`, `cname`, `kol`, `id_ediz`, `price`, `id_cimport`) VALUES (NULL, '1', 'Ананас', '10', '1', '180', 'dys51te3z89v');



На выходе должны получить такое:
Таблица единиц измерения
id iname id_iimpor 1шт. dskut7fd2d 2ящикf93e1128c83a3кгzve5sr0ht6
синим выделен ИД-импорта, которого нету при добавлении "Топор", но в таблице он должен остаться

Таблица категорий
id kname descr id_kimport 1Фруктыfd512dfser32Алкогольные напиткиbgr07ed953Инструментыjdhr69etr3

Таблица товаров
id id_kategor cname kol id_ediz price id_cimport 11Ананас10 5 195.7 dys51te3z89v22Пиво Жигулевское52240.515e9b8c48d31Груши321055.4765lc8we24s43Топор101159.99k8eg5r6t551Яблоки красные50355.2lekrw6kdr
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]