Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Исходные данные следующие. Имеем таблицу товара:
A
B
C
D
E
F

Необходимо определить аналоги для их последующей выборки. Например: A заменяемо на B, A заменяемо на С, E заменяемо на A. Замены "двухсторонние". На поверхности 2 варианта таблиц аналогов:
Первый
| K1 | K2 |
| A  | B  |
| A  | D  |
| E  | A  |

Выборку можно сделать:
 select K1 from tab where K1=A
union
select K2 from tab where K2=A

Получим: аналоги A: B, D, E
Второй вариант:
При "связки" аналогов в таблицу добавляем обе связи:
| K1 | K2 |
| A  | B  |
| B  | A  |
| A  | D  |
| D  | A  |
| E  | A  |
| A  | E  |

тогда:
 select K1 from tab where K1=A

Второй вариант, я так думаю, будет работать быстрее при выборке. В данной задаче критично время выборки.
НО(!!!):
Предполагается что если: A заменяемо на B, A заменяемо на С, E заменяемо на A то и B на С, B на E, C на B и т.д.
Вот тут и проблема....
Можно, конечно, при заполнении таблицы аналогов прописывать сразу все связи, но при большом количестве аналогов это жуть... тем более предполагается периодическое добавление аналогов, а это построение всех новых связей на основе имеющихся.
Я думаю, что такой вопрос наверняка уже обсуждался, но не знаю даже как сформулировать поиск :)
27 окт 15, 10:30    [18331319]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Glory
Member

Откуда:
Сообщений: 104760
shefus
Я думаю, что такой вопрос наверняка уже обсуждался,

А вопрос то какой ?
27 окт 15, 10:32    [18331326]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Я так понимаю необходимо использовать первый вариант, но как из него "вытащить" все связи?
27 окт 15, 10:33    [18331332]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Glory
Member

Откуда:
Сообщений: 104760
shefus
Я так понимаю необходимо использовать первый вариант, но как из него "вытащить" все связи?

Рекурсивные связи вытаскиваются рекурсивным же запросом
27 окт 15, 10:34    [18331337]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Glory,
т.е. копать в сторону "рекурсивные запросы"? Ок, спасибо!
27 окт 15, 10:36    [18331347]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
o-o
Guest
Glory
shefus
Я думаю, что такой вопрос наверняка уже обсуждался,

А вопрос то какой ?

Он еще пока не решил, как организовать само хранение аналогов . И это и есть его вопрос
27 окт 15, 10:37    [18331352]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
Он еще пока не решил, как организовать само хранение аналогов . И это и есть его вопрос

Тогда для это есть форум Проектирование БД
27 окт 15, 10:38    [18331356]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20609
shefus
На поверхности 2 варианта таблиц аналогов:

На поверхности только один подход - введение понятия "аналогичная группа" и соответствующего поля. Если значение этого поля двух записей совпадает - товары взаимозаменяемы, иначе нет.
А то, что "плавает" у тебя - это всего лишь денормализованные "костыли".
27 окт 15, 10:41    [18331366]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
o-o,

Угу. Тут вопрос в том, будет ли рекурсивный запрос достаточно быстро работать. Дело в том что это довольно критично. Записей около 20 000 ( с перспективой до 100 000) и каждой может соответствовать до 20-ти аналогов.
27 окт 15, 10:41    [18331368]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Akina,

Хм... нда..., это решает проблему. В эту сторону и не думал. Спасибо.
27 окт 15, 10:44    [18331382]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Glory
Member

Откуда:
Сообщений: 104760
shefus
Тут вопрос в том, будет ли рекурсивный запрос достаточно быстро работать.

А быстро - это сколько в граммах ?
27 окт 15, 10:46    [18331391]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Glory,
1-2 сек. :)
27 окт 15, 10:47    [18331396]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Jaffar
Member

Откуда:
Сообщений: 633
shefus,

Модель видится такая:
1.Таблица(П1, П2) для наполнения пользователями связи типа А <--> B, на ней триггер который вставляет данные во 2 таблицу.
2.Вторая таблица типа (Гр, П) группа - препарат.
3.на второй таблице 2 индекса IX_1(П, Гр) и индекса IX_2(Гр, П) + unique(Гр, П).

Стратегия выбора из второй такая:
1.выбрать все группы в которых встречается введенное лекарство( with(nolock, index = IX_1)) в
declare @__TEMP table(Group int not nULL primary key) - sql неявно создаст PK по темповой табличке.

2.
insert @__TEMP2(П) -- @__TEMP2 - создаем аналогично
select distinct t2.П
from @__TEMP t
join ВТроая_Табл t2 with(nolock, index = IX_2) on t2.Гр = t.Гр

3.далее выбираем через @__TEMP2 - все нужные атрибуты Препарата, его наличиче в группаи и т.п.
27 окт 15, 12:37    [18332102]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
shefus,

обычная задача объединения множество "многие-ко-многим", выполняется посредством третьего множества-фильтра.
27 окт 15, 12:48    [18332152]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
shefus
Member

Откуда:
Сообщений: 116
Ок. Всем спасибо! Буду пробовать варианты.
27 окт 15, 12:51    [18332173]     Ответить | Цитировать Сообщить модератору
 Re: Поиск (таблица) аналогов  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
shefus
Ок. Всем спасибо! Буду пробовать варианты.


Граф с циклами
27 окт 15, 12:56    [18332194]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить