Как я могу использовать флаги для более чем 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
возможно, вы правы. Я никогда раньше не пользовался форумами, так что это может быть хорошей идеей для меня, чтобы начать ^_^