Andy Lanng Ответов: 1

Как я могу использовать флаги для более чем 64 элементов SQL


Привет,

Просто выкладываю это туда, чтобы посмотреть, есть ли у меня какие-нибудь классные идеи. Не знаю, как я это сделаю, но, вероятно, с помощью связывающей таблицы.

НБ: я уверен, что здесь есть лучшие термины, но я не могу их придумать, поэтому, пожалуйста, простите.

Итак, моя миссия состояла в том, чтобы создать супер быстрый поиск по 100 тысячам до 1 миллиона предметов, используя несколько критериев поиска (до 30).
некоторые данные являются единичными (например, цена в долларах США: есть только 1 за товар)
некоторые данные могут быть кратными (например, доступные цвета: каждый элемент может иметь 0 или более)
некоторые данные являются сингулярными, но могут быть найдены как кратные (т. е. каждый элемент имеет 1 размер, но поиск может включать размер 10 или 12)

Мне удалось сохранить запрос супер-пупер быстрым, используя флаги вместо кратных чисел. Отлично, пока данные имеют меньше, чем 65 вариантов. Самый сложный поиск от ipad до api и обратно: < 0,1 секунды!! (с пейджингом и немногими деталями, но это создает впечатление вневременности)

Теперь я нашел категорию, которая была единственной (магазин), но теперь меня попросили сделать ее множественной. Хорошо но:
Теперь он многократен на уровне товара (каждый товар может быть доступен в нескольких магазинах)
Теперь он является множественным в качестве уровня поиска (каждый поиск может включать в себя несколько магазинов)
Здесь насчитывается около 150 магазинов.

С любым из этих критериев я мог бы справиться, черт возьми, дайте мне 2. Но все 3 >_<


Некоторые поддельные данные, например, для:
with sizes as (
  select 1 as id, 'uk 10' as ukName
  union select 2,  'uk 12'  
  union select 4,  'uk 14'  
  union select 8,  'uk 16'  
), colours as (
  select 1 as id, 'red' as ukName
  union select 2,  'black'  
  union select 4,  'green'  
  union select 8,  'blue'   
), currency as (
  select GUID1 as id, 'USD' as ukName, 1 as ExRt
  union select GUID2,  'GBP' , 1.2
  union select GUID3,  'EUR'  ,1.1
), Items as (
  select Guid1 as Id, 1 as Size, 15 as Colour
  union select Guid2 , 2 , 15
  union select Guid2 , 4 , 7
  union select Guid2 , 2 , 15
  union select Guid2 , 8 , 1
  union select Guid2 , 2 , 3
 ), ItemPrices as (
  select i.Id as ItemId, (10 + i.Size) * c.ExRt as price, c.Id as currencyid
  from Items i, currency c
 )

Это просто чтобы показать вам, как выглядят различные стили данных. В таблицах поиска магазина чтения почти все сглажено в таблицах.

Таким образом, поиск может выглядеть следующим образом
Select i.id
from Items i
inner join itemprices p on i.id = p.itemid and p.currencyid = 'GUID1'
where (Size | 4) > 0 and (Colour | 1) = 1


Представьте себе, что с 30 критериями (но я сумел быть умным с некоторыми) и 1 миллионом пунктов! Я очень горжусь ^_^


Как я уже сказал, просто ищу идеи / предложения. Любой новый ракурс будет оценен по достоинству.

Извините за бред. Я надеюсь, что это имеет смысл (по крайней мере, в основном)

Что я уже пробовал:

Я попытался использовать 2 поля bigint, но не смог понять, как различать (1,2), (2,2) и (2,1). Может быть,если бы я убедился, что из (А, Б) А>б?

Я также пробовал агрегаты и функции CLS для обработки больших двоичных файлов, чем bigint, но они были слишком медленными.

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

Richard Deeming

(Size | 4) > 0

Что делают эти критерии поиска? Насколько я могу судить, какой-нибудь значение в Size колонка будет соответствовать этому. Вы уверены, что не имели в виду Size & 4?

Andy Lanng

Упс да. Я тоже допустил ту же ошибку в своей функции clr

DaveAuld

Похоже, что вы открываете дискуссию (если вы выставляете ее, чтобы посмотреть, есть ли у вас какие-то классные идеи), а не прямой вопрос, не лучше ли это сделать на одном из форумов?

Andy Lanng

возможно, вы правы. Я никогда раньше не пользовался форумами, так что это может быть хорошей идеей для меня, чтобы начать ^_^

1 Ответов

Рейтинг:
1

Gerry Schmitz

"Критерии" обычно включают в себя первичные и вторичные ключевые кандидаты или "глубину" "дерева" (около 4) и никогда не увидят "30 критериев".

4 "и" и "или" с атрибутами, которые позволяют охватить диапазон 99%+ случаев в моем опыте.

Атрибуты варьируются в зависимости от ситуации (отчет; запрос, транзакция), но все же не намного больше 4 для любого типичного случая использования.


Andy Lanng

Спасибо за Ваш вклад. Я уверен, что это отличный ответ на чей-то вопрос. Вы уверены, что хотели опубликовать его как решение моей проблемы?