Optimisation a system to receive products from a database

User avatar
FreemanUSA
Уже с Приветом
Posts: 349
Joined: 24 Jul 2012 23:26
Location: echo RU::US($me);

Optimisation a system to receive products from a database

Post by FreemanUSA »

Проблемка возникла, сэкономить серверный ресурс при выводе продукции из базы данных. Как правило мы(я) пишем метод который опираясь на айди категории выводит все совподения продуктов на юзер итерфейс. Но вот если допустим, мы вызываем главную категорию получаеться что продукт привязянный к саб-категории не проявится на юзер интерфейсе для этой главной категории. Но если мы создадим и добавим путь который имеет саб-категория от родительского айди до айди этой саб-категории наподобия 1\5\4 и отправим продукту. В первый реквест получаем айди и этот путь со всех продуктов. Переводим путь в массив или в листы и сравниваем в лупе категории айди с айди в этом массиве, если присутствует, то отправляем айди в другой массив или лист. После берём этот массив и вызываем полную инфу на продукты которые совпали. Решение может быть затёртое, не знаю, сам просто написал что первое пришло в голову, но может быть у когото есть посвежее. А то это работает для 1000 позиций продукции, а если 100000 или более. Юзер устанет ждать. СПС
User avatar
BronenosezPotemkin
Уже с Приветом
Posts: 3008
Joined: 28 Feb 2013 03:18
Location: NY

Re: Optimisation a system to receive products from a database

Post by BronenosezPotemkin »

А что за база данных? Почему нельзя в одном запросе получить все релевантные продукты с помощью JOIN?
User avatar
FreemanUSA
Уже с Приветом
Posts: 349
Joined: 24 Jul 2012 23:26
Location: echo RU::US($me);

Re: Optimisation a system to receive products from a database

Post by FreemanUSA »

MySQL, да можно, но как сапоставить отношения продукта по иностранному ключу который привязан к саб-категории, саб-категории и ..... к родительской категории которая имеет другое айди? Если я вызываю родительскую или саб-родительскую категорию.
User avatar
BronenosezPotemkin
Уже с Приветом
Posts: 3008
Joined: 28 Feb 2013 03:18
Location: NY

Re: Optimisation a system to receive products from a database

Post by BronenosezPotemkin »

FreemanUSA wrote: 10 May 2017 21:22 MySQL, да можно, но как сапоставить отношения продукта по иностранному ключу который привязан к саб-категории, саб-категории и ..... к родительской категории которая имеет другое айди? Если я вызываю родительскую или саб-родительскую категорию.
Шо такое иностранный ключ? 8O Как я уже написала - JOIN между таблицами.
User avatar
katit
Уже с Приветом
Posts: 23960
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Optimisation a system to receive products from a database

Post by katit »

Ну тут похоже просто случай с иерархией. Для этого есть всякие способы а в взрослых базах всякие CTE и рекурсивные квери.

В любом случае все это решается в базе. Может даже надо написать хранимую процедуру вместо запроса.
Лучше водки — хуже нет! ©
adda_
Уже с Приветом
Posts: 10708
Joined: 22 Jul 2006 20:19

Re: Optimisation a system to receive products from a database

Post by adda_ »

BronenosezPotemkin wrote: 10 May 2017 21:31
FreemanUSA wrote: 10 May 2017 21:22 MySQL, да можно, но как сапоставить отношения продукта по иностранному ключу который привязан к саб-категории, саб-категории и ..... к родительской категории которая имеет другое айди? Если я вызываю родительскую или саб-родительскую категорию.
Шо такое иностранный ключ? 8O Как я уже написала - JOIN между таблицами.
Похоже что человек не знаком с основами сиквела.
ТС.
Вы нарисуйте структуру таблиц пожалуйста.
User avatar
FreemanUSA
Уже с Приветом
Posts: 349
Joined: 24 Jul 2012 23:26
Location: echo RU::US($me);

Re: Optimisation a system to receive products from a database

Post by FreemanUSA »

Иностранный ключь это ссылка по которй привязан продукт к определённой категории. Блин, я прям не знаю как объяснить то. Ну допусти таблица категорий создана на основе того как TheStack каждая категория имеет иностранный ключь с родительским айди, систем для того что бы создавать бесконечное количество саб-категории. Вот мы вызываем родительскую категорию у котори тоже есть родительская категория и допустим три саб-категории у которых тоже есть сабкатегории. Как в эту родительскую категорию получить все продукты которые привяззаны к ней и ко всем её саб-категориям если у продуктов только иностранный ключ одной категории которая являеться саб-категорией.
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: Optimisation a system to receive products from a database

Post by oshibka_residenta »

Один запрос или нет -если проблема в том, что обход по всем этим саб-категориям занимает много времени, можно сделать chunked output на сервере. А на клиенте ( Get First /Get Next). Таким образом клиент может видеть часть результатов не дожидаясь пока все результаты получены.

Конечно, request при этом перестает быть stateless.
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: Optimisation a system to receive products from a database

Post by oshibka_residenta »

BronenosezPotemkin wrote: 10 May 2017 21:31
FreemanUSA wrote: 10 May 2017 21:22 MySQL, да можно, но как сапоставить отношения продукта по иностранному ключу который привязан к саб-категории, саб-категории и ..... к родительской категории которая имеет другое айди? Если я вызываю родительскую или саб-родительскую категорию.
Шо такое иностранный ключ? 8O Как я уже написала - JOIN между таблицами.
иностранный ключ = foreign key
Никогда не знал как оно по-русски. Я бы перевел "чужой ключ".
User avatar
BronenosezPotemkin
Уже с Приветом
Posts: 3008
Joined: 28 Feb 2013 03:18
Location: NY

Re: Optimisation a system to receive products from a database

Post by BronenosezPotemkin »

oshibka_residenta wrote: 10 May 2017 21:58
иностранный ключ = foreign key
Никогда не знал как оно по-русски. Я бы перевел "чужой ключ".
Аaaa :lol:
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15477
Joined: 27 Sep 2007 22:53

Re: Optimisation a system to receive products from a database

Post by Мальчик-Одуванчик »

oshibka_residenta wrote: 10 May 2017 21:58
BronenosezPotemkin wrote: 10 May 2017 21:31
FreemanUSA wrote: 10 May 2017 21:22 MySQL, да можно, но как сапоставить отношения продукта по иностранному ключу который привязан к саб-категории, саб-категории и ..... к родительской категории которая имеет другое айди? Если я вызываю родительскую или саб-родительскую категорию.
Шо такое иностранный ключ? 8O Как я уже написала - JOIN между таблицами.
иностранный ключ = foreign key
Никогда не знал как оно по-русски. Я бы перевел "чужой ключ".
Скорее "внешний", по аналогии с министерством иностранных дел и внешней политикой.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15477
Joined: 27 Sep 2007 22:53

Re: Optimisation a system to receive products from a database

Post by Мальчик-Одуванчик »

User avatar
FreemanUSA
Уже с Приветом
Posts: 349
Joined: 24 Jul 2012 23:26
Location: echo RU::US($me);

Re: Optimisation a system to receive products from a database

Post by FreemanUSA »

СПС всем ответившим. Таблица для категорий одна, я не создаю саб,саб.. и т.д. привязка идёт по родительскому айди, это снижает серверную нагрузку оперировать чисто одной таблицей и даёт возможность создавать бесконечное количество саб-категории. JOIN нельзя применить по одной простой причине, нечего соединять так как продукция тоже находиться в одной таблице, каждый товар привязан к айди категории или сабкатегории. Вопрос заключалься в то что необходимо добавить в строку продукта как орентир для вызова саб-категории продукции на основную категорию, родительскую, при этом снизив количество запрсов в базу данных и обработки конечного результата.
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: Optimisation a system to receive products from a database

Post by oshibka_residenta »

google: self-join
adda_
Уже с Приветом
Posts: 10708
Joined: 22 Jul 2006 20:19

Re: Optimisation a system to receive products from a database

Post by adda_ »

FreemanUSA wrote: 11 May 2017 21:23 СПС всем ответившим. Таблица для категорий одна, я не создаю саб,саб.. и т.д. привязка идёт по родительскому айди, это снижает серверную нагрузку оперировать чисто одной таблицей и даёт возможность создавать бесконечное количество саб-категории. JOIN нельзя применить по одной простой причине, нечего соединять так как продукция тоже находиться в одной таблице, каждый товар привязан к айди категории или сабкатегории. Вопрос заключалься в то что необходимо добавить в строку продукта как орентир для вызова саб-категории продукции на основную категорию, родительскую, при этом снизив количество запрсов в базу данных и обработки конечного результата.
На самом деле серверу пофигу - одна у вас таблица или не одна.
Если вы просто здесь выложите скрипт который создает таблицу, будет проще разговаривать.
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Optimisation a system to receive products from a database

Post by valchkou »

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

скажем так выглядит endpoint

Code: Select all

    
    Set<Products> getProductsForCategory(String categoryId) {
        Set<Products> result = []
        getRecursiveForcategory(categoryId, result)
        return result 
    }
это пример как можно собрать все продукты рекурсивно, можно использовать while.
код не оптимизирован под ваш конкретынй случай, pseudo java/groovy пример

Code: Select all

    getRecursiveForCategory(String categiryId, Set result) {
        Set subCategories = []
        Set<Products>  products = dao.queryById(categiryId)
        if (products) {          
            result.addAll(products)
            // collect all sub category ids
            for (Product p: products) {
                if (p.subCategoryId) subCategories.add(p.subCategoryId)
            }    
        }    
        
        // query from all subcategories
        for (String subCategoryId: subCategories) {
            getRecursiveForCategory(subCategoryId, result)
        }
    }
 
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Optimisation a system to receive products from a database

Post by АццкоМото »

Очень странный код
Мат на форуме запрещен, блдж!
User avatar
FreemanUSA
Уже с Приветом
Posts: 349
Joined: 24 Jul 2012 23:26
Location: echo RU::US($me);

Re: Optimisation a system to receive products from a database

Post by FreemanUSA »

Спс огромное за помощью всем. Подчерпнул некоторые аспекты и внёс в свой код, создал фековых товаров 1 миллион и разбросал в 10 категорий и углубил саб категории до 20 уровня. Поск идёт в норму ни как на Мандженте :), фактически выскакивание позиций на юзер итерфейс моментально. Теперь обкатываю систему против любого стороннего вмешательства на логин или какие либо рассылочные формы при общении с сервером. Преминил на каждый отправленный запрос как при входе в админ панель или на свой аккаунт с единично присвоенным айди ,через аджакс. То есть при запросе проверки данных если хэшированное айди не совподает то сервак просто игнорирует запрос. Если совподает айди, но логин данные не проходят то сервак отправляет обратно на вход и перепресваевает сгенерированное новое айди, высылая его в догонку. Так как система лимитированного входа по количеству запросов как в банках выносит мозг и просто банально раздражает ожидать 20-30 минут до следующей попытки как юзера. Может есть какие нибуть легче и более репродуктивные способы по защите против стороннего вмешательства.
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Optimisation a system to receive products from a database

Post by valchkou »

FreemanUSA wrote: 22 May 2017 01:01 Может есть какие нибуть легче и более репродуктивные способы по защите против стороннего вмешательства.
нет простых путей когда дело касается безопасности.
придется попотеть над изучением стандартов и best practice
https://oauth.net/2/
https://spring.io/guides/tutorials/spring-boot-oauth2/
https://www.owasp.org/index.php/Categor ... en_Project

Return to “Работа и Карьера в IT”