|
|
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Прошу помощи в решении следующей задачи: Есть склады с товарами Нужно организовать морфологический поиск товаров на складах с ограничением (например) по 2 позициям, при этом каждый новый морфологический поиск должен исключать ранее выбранные позиции пока не будут отобраны все позиции соответствующие одному и тому же запросу. Например: Склад №1, (ФИО ответственного), Вода питьевая «Слеза», цена Склад №2, (ФИО ответственного), Вода питьевая «Родник», цена Склад №1,(ФИО ответственного), Вода питьевая «Родник» , цена Склад №5, (ФИО ответственного), Вода питьевая «Столовая» , цена Склад №3, (ФИО ответственного), Вода питьевая «Кристалл» , цена Склад №4,(ФИО ответственного), Вода питьевая «Столовая» , цена Склад №5,(ФИО ответственного), Вода питьевая «Боржоми» , цена …. Делаю выборку по ключевым словам «ВОДА» и «ПИТЬЕВАЯ» ограничивая выборку двумя строками: Первая выборка Склад №1, (ФИО ответственного), Вода питьевая «Слеза» , цена Склад №2, (ФИО ответственного), Вода питьевая «Родник» , цена Во вторую выборку, позиции (Склад №1, (ФИО ответственного), Вода питьевая «Слеза» , цена и Склад №2, (ФИО ответственного), Вода питьевая «Родник» , цена) первой выборки, «как бы» должны встать в очередь в низ: Склад №1,(ФИО ответственного), Вода питьевая «Родник» , цена Склад №5, (ФИО ответственного), Вода питьевая «Столовая» , цена Склад №3, (ФИО ответственного), Вода питьевая «Кристалл» , цена Склад №4,(ФИО ответственного), Вода питьевая «Столовая» , цена Склад №5,(ФИО ответственного), Вода питьевая «Боржоми» , цена ---------- Склад №1, (ФИО ответственного), Вода питьевая «Слеза» , цена Склад №2, (ФИО ответственного), Вода питьевая «Родник» , цена Затем получаем результат второй выборки в виде: Склад №1,(ФИО ответственного), Вода питьевая «Родник» , цена Склад №5, (ФИО ответственного), Вода питьевая «Столовая» , цена Третья выборка: Склад №3, (ФИО ответственного), Вода питьевая «Кристалл» , цена Склад №4,(ФИО ответственного), Вода питьевая «Столовая» , цена Следующая: Склад №5,(ФИО ответственного), Вода питьевая «Баржоми» , цена Склад №1, (ФИО ответственного), Вода питьевая «Слеза» , цена И так далее, по кругу… каждые ранее отобранные товары становиться в очередь в конце списка. Мое решение: Создал таблицу склады: 1. ИндексСклада 2. НазваниеСклада 3. Ответсвенный Затем таблицу товаров: 1. ИндексТовара 2. ИндексСклада [принадлежность товара складу] 3. НазваниеТовара 4. ЦенаТовара Пример: 1, Вода питьевая «Слеза», 1(индекс Склада №1), 100р. 2, Вода питьевая «Кристалл», 2(индекс Склада №2), 100р. 3, Вода питьевая «Слеза», 2(индекс Склада №2), 100р. 4, Вода столовая, 3(индекс Склада №3), 50р. 5, Вода туалетная, 3(индекс Склада №3), 70р. 6, Питьевая кружка 4(индекс Склада №3), 5р. и т.д. каждый склад может содержать одинаковые марки воды и товары. Затем для обеспечения морфологического поиска я создал таблицу в которой будут храниться ключевые слова, по которым и будет происходить морфологический поиск. 1. Индекс (пока не знаю, нужен ли цифровой индекс или индексом можно сделать само нормализованное ключевое слово (они не будет повторяться в этой таблице)? Вопрос: «Будет ли падение скорости из-за текстового индекса?») 2. НормализованноеКлючевоеСлово Пример: 1,ВОДА 2,ПИТЬЕВАЯ 3,СЛЕЗА 4,РОДНИК 5,КРИСТАЛЛ 6,СТОЛОВАЯ 7,БОРЖОМИ 8,КРУЖКА 9,ТУАЛЕТНАЯ Далее я создал таблицу связи ИндексогоСлова и Товара 1. Индекс 2. ИндексНормализованноеКлючевоеСлово 3. ИндексТовара 4. СчетчикОтборов Пример: 1, 1(индекс ВОДА), 1(индекс Вода питьевая «Слеза»), 1 2, 1(индекс ВОДА), 2(Вода питьевая «Кристалл»), 0 3, 1(индекс ВОДА), 3(Вода питьевая «Слеза»), 2 4, 1(индекс ВОДА), 4(Вода столовая),1 5, 1(индекс ВОДА), 4(Вода туалетная),1 6, 2(индекс ПИТЬЕВАЯ), 1(индекс Вода питьевая «Слеза»), 3 7, 2(индекс ПИТЬЕВАЯ), 1(индекс Вода питьевая «Кристалл»), 7 8, 2(индекс ПИТЬЕВАЯ), 1(индекс Питьевая кружка), 4 И т.д. СчетчикОтборов – нужен мне для того что бы ставить ранее отобранный товар в очередь. Например если товар отобран, то СчетчикОтборов+1. А каждая последующая выборка будет сортироваться по убывания поля «СчетчикОтборов» и ограничиваться двумя строками, таким образом, я всегда буду получать два товара с минимальным счетчиком отбора(которые еще не выбирали). Это обеспечит постановку ранее отобранных товаров вниз по списку. Проблема №1 При поиске товаров по ключевым словам «ВОДА» и «ПИТЬЕВАЯ» я получу индексы всех товаров, в которых встречается хотя бы одно ключевое слово. Например: 1, 1(индекс ВОДА), 1(индекс Вода питьевая «Слеза»), 1 2, 1(индекс ВОДА), 2(Вода питьевая «Кристалл»), 0 3, 1(индекс ВОДА), 3(Вода питьевая «Слеза»), 2 4, 1(индекс ВОДА), 4(Вода столовая),1 5, 1(индекс ВОДА), 4(Вода туалетная),1 6, 2(индекс ПИТЬЕВАЯ), 1(индекс Вода питьевая «Слеза»), 3 7, 2(индекс ПИТЬЕВАЯ), 1(индекс Вода питьевая «Кристалл»), 7 8, 2(индекс ПИТЬЕВАЯ), 1(индекс Питьевая кружка), 4 Явно строки №5 и 8 меня не устраивает! При группировке по КЛЮЧЕВЫМ СЛОВАМ, как я понимаю, я буду вынужден отбросить значения индексов таблицы (связи ИндексогоСлова и Товара), а следовательно не смогу увеличить счетчик отбора каждой из позиции для постановки выбранных товаров вниз очереди. Проблема №2 Даже если выборка получиться, в выборку мне необходимо будет добавить еще данные по складам (Название склада отобранного товара и ответственный по этому складу) Таким образом, я не умещаюсь в один запрос поиска по ключевым словам «ВОДА» и «ПИТЬЕВАЯ» и с результатом вида: Склад, Ответственный, ИндексТовара, НаименованиеТовара, СчетчикОтборов Прощу помощи, может как то перепроектировать структуру? Или есть варианты составления оптимальных по ресурсо-затратам запросов к моей схеме? Хотелось бы оптимизировать решение задачи под высокую производительность результирующего набора данных!!! Заранее всем высказавшим свое мнение, подсказавшим правильный «вектор», огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 04:36 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666, Очевидная уже проблема: авторЗатем таблицу товаров: 1. ИндексТовара 2. ИндексСклада [принадлежность товара складу] 3. НазваниеТовара 4. ЦенаТовара Товар не зависит от склада. Цена товара тоже может не зависить от склада, но може и зависить. Таблицу надо перепроектировать, разделять на две или более. То, что ты называешь "морфологический поиск", это полнотекстовый поиск. full text search . Для его поддержки в MySQL есть специальные полнотекстовые индексы и специальные ключевые слова в SQL. А ты пытаешься это делать сам руками. Я думаю, вряд ли у тебя получится лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 05:50 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
сори, я почему-то подумал, что это -- MySQL у тебя. Но всё равно, полнотекстовый поиск есть во многих СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 05:52 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
MasterZivLamer666, Очевидная уже проблема: авторЗатем таблицу товаров: 1. ИндексТовара 2. ИндексСклада [принадлежность товара складу] 3. НазваниеТовара 4. ЦенаТовара Товар не зависит от склада. Цена товара тоже может не зависить от склада, но може и зависить. Таблицу надо перепроектировать, разделять на две или более. То, что ты называешь "морфологический поиск", это полнотекстовый поиск. full text search . Для его поддержки в MySQL есть специальные полнотекстовые индексы и специальные ключевые слова в SQL. А ты пытаешься это делать сам руками. Я думаю, вряд ли у тебя получится лучше. Имеешь ввиду что лучше сделать: Таблицу товаров, Таблицу складов, Таблицу цен И затем их связать по индексам в связующих таблицах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 14:49 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 14:52 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
MasterZivОчевидная уже проблема: авторЗатем таблицу товаров: 1. ИндексТовара 2. ИндексСклада [принадлежность товара складу] 3. НазваниеТовара 4. ЦенаТовара Да никакой тут проблемы и нету... добавить ещё количество и всё супер... как на ладони: что, где, почем и сколько... Единственное - Название товара заменить на индекс из классификатора и всё... А вот тут http://www.sql.ru/forum/actualfile.aspx?id=16392993 действительно проблема: - пришел очередной товар с ценой дороже чем такой же предыдущий и переоценивать нельзя (нужно старый продавать по старой цене, а новый - по новой) и всё... приплыли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 15:36 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
vmag- пришел очередной товар с ценой дороже чем такой же предыдущий и переоценивать нельзя (нужно старый продавать по старой цене, а новый - по новой) и всё... приплыли... И как эту проблему будет решать единая таблица с товарами, складами и ценами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 18:18 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинИ как эту проблему будет решать единая таблица с товарами, складами и ценами? в таблице товар просто появится новая строка с очередным количеством и новой ценой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:33 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
vmag, 1. Решение, мягко говоря, кривое 2. Ничто не мешает сделать то же самое и в схеме с тремя таблицами. Мое мнение по поводу решения с тремя таблицами - таблица цен в таком виде, конечно, непонятно что собой символизирует. У товара может быть несколько цен в один и тот же период времени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 20:16 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинvmag, 1. Решение, мягко говоря, кривое 2. Ничто не мешает сделать то же самое и в схеме с тремя таблицами. Мое мнение по поводу решения с тремя таблицами - таблица цен в таком виде, конечно, непонятно что собой символизирует. У товара может быть несколько цен в один и тот же период времени? Как вариант "Закупочная", "Розничная", "Оптовая" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 20:39 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
MasterZivсори, я почему-то подумал, что это -- MySQL у тебя. Но всё равно, полнотекстовый поиск есть во многих СУБД. Спасибо за подсказку. Но как решить вопрос выборки (при использовании встроенного механизма полнотекстового поиска) с не повторяющейся выборкой по ключевой фразе? Например: Результат выборки "вода питьевая" всего в БД 100 позиций. Мне нужно при первом запросе вида "вода питьевая" отобрать 20 первых строк, при втором запросе "вода питьевая" (это может быть через час, а может через три часа) отобрать следующие 20 строк (исключая строки первой выборки), на следующий день появился третий запрос вида "вода питьевая", я должен отобрать следующие 20 строк из общих 100-а, исключая первые 40 вчерашних строк. Итак до тех пор, пока не покажу все до одной строки из 100 по 20 строк, и по новому. Как реализовать сие чудо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 21:59 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666Как реализовать сие чудо? А очень просто: выбрал 20 - удали их. delete from ... returning. Второй запрос автоматически их пропустит. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 22:07 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА очень просто: выбрал 20 - удали их. delete from ... returning. Второй запрос автоматически их пропустит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 22:59 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666Итак до тех пор, пока не покажу все до одной строки из 100 по 20 строк, и по новому. а когда удалишь все, то загружаешь их (все 100) по новой и так в цикле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:01 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
vmagLamer666Итак до тех пор, пока не покажу все до одной строки из 100 по 20 строк, и по новому. а когда удалишь все, то загружаешь их (все 100) по новой и так в цикле... Это прикол или вы серьезно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:06 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666Это прикол или вы серьезно? Абсолютно серьёзно. Странной задаче - странное решение. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:11 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovLamer666Это прикол или вы серьезно? Абсолютно серьёзно. Странной задаче - странное решение. А откуда удалять то, если выборка идет из таблицы товаров? Вариант с сортировкой чем хуже? PS: (Отобранным позициям таблицы товаров увеличиваем "индекс отбора", следующую выборку делаем с сортировкой по возрастанию "индекса отбора", таким образом в низ будут скапливаться отобранные ранее позиции, сверху (с меньшим индексом "индекс отбора") еще не отобранные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:36 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666Кот Матроскинvmag, 1. Решение, мягко говоря, кривое 2. Ничто не мешает сделать то же самое и в схеме с тремя таблицами. Мое мнение по поводу решения с тремя таблицами - таблица цен в таком виде, конечно, непонятно что собой символизирует. У товара может быть несколько цен в один и тот же период времени? Как вариант "Закупочная", "Розничная", "Оптовая" Для этого как минимум нужно поле type в таблице цен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:58 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666PS: (Отобранным позициям таблицы товаров увеличиваем "индекс отбора", следующую выборку делаем с сортировкой по возрастанию "индекса отбора", таким образом в низ будут скапливаться отобранные ранее позиции, сверху (с меньшим индексом "индекс отбора") еще не отобранные) не забудь в своем случае каждому новому пользователю добавлять свой персональный индекс для просмотра.... а то чё - ты мля посмотрел свои первые 20 строк и пометил их, а я чё - если зайду буду смотреть со строки 21 ??? так не честно.... я тоже хочу посмотреть первые 20... и вася тоже захочет и петя.... чё им смотреть с конца чо ль.... лучше тогда сразу смотреть на конец.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:59 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
On 03.08.2014 22:59, Lamer666 wrote: > Спасибо за подсказку. > Но как решить вопрос выборки (при использовании встроенного механизма > полнотекстового поиска) с _*не повторяющейся выборкой*_ по ключевой фразе? Сначала тебе нужно спроектировать структуру БД, а потом уже думать о запросах. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 15:14 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
On 04.08.2014 00:06, Lamer666 wrote: > Итак до тех пор, пока не покажу все до одной строки из 100 по 20 строк, > и по новому. > > > > а когда удалишь все, то загружаешь их (все 100) по новой и так в цикле... > Это прикол или вы серьезно? Шутка, естественно. Видимо, это был сарказм по поводу очень большого кол-ва строк с товарами в твоей БД. ДОлжна быть одна строка. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 15:15 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666, А что это за таблица там у тебя " ОстаткиНасклодах " ? Вот с этого вот неумения элементарно написать слово без ошибок и начинается форменное рас%#$дяйство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 15:26 |
|
||
|
Задача по проектировани БД.
|
|||
|---|---|---|---|
|
#18+
Lamer666, Столбец " НаваниеСклада " из той же оперы. Представляю, что за БД ты там на%#евертишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 15:29 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=28&tid=1540834]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 161ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...