|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Здравствуйте! Прошу совета, ибо уже сломал голову пытаясь решить задачу. Нужно сделать поиск по пользователям сайта. У пользователей могут быть указаны некоторые атрибуты (число возможных атрибутов 200-300). В основном эти атрибуты не имеют значений, а являются, по сути, просто флагами (например, "есть борода"). Но есть и атрибуты со значениями (например, "рост" - "185"). Реально каждому пользователю присваивается порядка 5-50 атрибутов. Количество пользователей - сотни тысяч. Но нужно иметь уверенность, что это сможет быть без проблем смасштабировано еще на пару порядков. Таким образом, вроде бы, эта задача идеально ложится на Entity-attribute-value модель. В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутами, но поддержка решения при этом заметно усложняется (особенно учитывая, что оно должно работать в режиме 24/7, а новые виды атрибутов появляются довольно часто). Да к тому же индексирование каждой из этих колонок тоже повлечет свои проблемы. В общем, типовой use case - это выборка пользователей, подпадающих под заданные критерии. Критериев может быть указано довольно много (от единиц до десятков), нужно поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. И трудность заключается в том, что это должно работать быстро. Для рядовых запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго). Я пробовал моделировать это на Postgres, для 100 тыс. пользователей, для запросов по нескольким критериям работает конечно нормально. Но при увеличении количества критериев в запросе быстро умирает, даже при оптимизации по самые помидоры. SQL Server заметно более шустрый, но все равно, большое количество критериев быстро обработать не получается. Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 07:13 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Васисуалий Пупкинсон, В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы (они отлично подходят под ваши условия). Возможно, что разделил таблицу для запросов и таблицу для добавления новых данных. Таблицу для запросов бы периодически перестраивал. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 08:24 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Я бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей. Запросы в Оракле вполне приемлемо работают через банальные GROUP BY ... HAVING COUNT(*)=..., а вот для MySQL пришлось покумекать над оптимизацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 14:07 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
можно еще попробовать indexed view или взрослый партитионинг по юзер ид. имхо ничего лучше реляционной субд для такой задачи не найти ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 14:09 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Yo.!взрослый партитионинг по юзер ид.Ну если только по достаточно крупному диапазону (например, с шагом в тысячу или десять тысяч). Иначе ораклоиды не одобрят - 9963426 . ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 14:14 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, > но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый Кто тебе мешает использовать гибрид обычной реляционной БД с EAV ? Важные атрибуты -- в виде обычных колонок таблиц, остальные, дополнительные -- в виде EAV. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 14:26 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 8:24, Alexander Ryndin wrote: > В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы > (они отлично подходят под ваши условия). Возможно, что разделил таблицу для Они вообще мало подо что подходят. Да и вообще они не индексы. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 14:26 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
MasterZivOn 10.01.2011 8:24, Alexander Ryndin wrote: > В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы > (они отлично подходят под ваши условия). Возможно, что разделил таблицу для Они вообще мало подо что подходят. Да и вообще они не индексы. Аргументы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 15:15 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Интересная задачка. Поддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 15:48 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Ggg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. +1. Решение, оправдавшее себя многолетней практикой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 15:53 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Кажется, именно с проблемой выборок по большому количеству критериев призваны бороться GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 15:59 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 15:15, Alexander Ryndin wrote: > Они вообще мало подо что подходят. Да и вообще они не индексы. > > Аргументы? Аргументов не будет. Так же, как и флейма на тему "Занахрена кому нужны битмап-индексы". Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 17:12 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > Критериев может быть указано довольно много (от единиц до десятков), нужно > поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. Сторонники решения проблемы с помощью битмап-индексов могут рассказать автору топика о том, как они собираются применять эти индексы для вышепроцитированой задачи. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 17:17 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > В общем, типовой use case - это выборка пользователей, подпадающих под заданные > критерии. > Критериев может быть указано довольно много (от единиц до десятков), нужно > поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. > И трудность заключается в том, что это должно работать быстро. Для рядовых > запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго). А типовые запросы можно увидеть ? Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность тут вообще ни при чём. А NOT IN вообще очень тяжёлая операция. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 17:20 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Васисуалий Пупкинсон, Найли тут iv_an_ru. У него как раз подобные психованные запросы на virtuoso обрабатываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 17:47 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Bitmap -индексы в СУБД Caché. ПримерClass del.a Extends %Persistent { Index ia On a [ Type = bitmap ]; Index ib On b [ Type = bitmap ]; Index ic On c [ Type = bitmap ]; Index id On d [ Type = bitmap ]; Property a As %Integer; Property b As %String; Property c As %Date; Property d As %Boolean; ClassMethod Fill(N As %Integer = {1e6}) As %Status { do ##class(del.a).%KillExtent() set c=0 for i=1:1:N set c=c+1,^del.aD(c)=$lb("",$r(1e5),$r(1e5),$r(1e5),$r(2)) s ^del.aD=c do ##class(del.a).%BuildIndices() q $$$OK } } Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:02 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
miksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей. Сейчас в таблице есть три поля: attribute_id int value int user_id int Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:03 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
MasterZivОни вообще мало подо что подходят. Да и вообще они не индексы. Аргументов не будет. Так же, как и флейма на тему "Занахрена кому нужны битмап-индексы".Мдя-я-я. Не ел, но уверен, что гадость. MasterZivOn 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > В общем, типовой use case - это выборка пользователей, подпадающих под заданные > критерии. > Критериев может быть указано довольно много (от единиц до десятков), нужно > поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. > И трудность заключается в том, что это должно работать быстро. Для рядовых > запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго). А типовые запросы можно увидеть ? Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность тут вообще ни при чём. А NOT IN вообще очень тяжёлая операция. BITMAP-индекс как раз отлично решает эту задачу с AND и OR. Они также специально предназначен именно для случаев, когда количество различных значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как применять? Строим на часто используемые поля BITMAP-индексы и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:08 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Yo.!можно еще попробовать indexed view или взрослый партитионинг по юзер ид. имхо ничего лучше реляционной субд для такой задачи не найти Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо. Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:09 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
pkarklinGgg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. +1. Решение, оправдавшее себя многолетней практикой. Спасибо, попробую поэкспериментировать с этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:10 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?.. Как-то с ходу не очень понятно как их прикрутить-то с таким прицелом... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:13 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
MasterZivА типовые запросы можно увидеть ? Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность тут вообще ни при чём. А NOT IN вообще очень тяжёлая операция. Типовой запрос с AND и OR например такой: женщина И город - С.Петербург И не замужем И цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба) И цвет волос - блондинка EXCLUDE курит Насчет NOT IN - тут может быть несколько облегчает задачу то, что это условие можно накладывать в самом конце, на то, что уже выбрано предыдущими операторами. Т.е. в теле основного запроса этих ограничений встечаться не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:22 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Alexander RyndinMasterZivОни вообще мало подо что подходят. Да и вообще они не индексы. Аргументов не будет. Так же, как и флейма на тему "Занахрена кому нужны битмап-индексы".Мдя-я-я. Не ел, но уверен, что гадость. MasterZivOn 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > В общем, типовой use case - это выборка пользователей, подпадающих под заданные > критерии. > Критериев может быть указано довольно много (от единиц до десятков), нужно > поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. > И трудность заключается в том, что это должно работать быстро. Для рядовых > запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго). А типовые запросы можно увидеть ? Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность тут вообще ни при чём. А NOT IN вообще очень тяжёлая операция. BITMAP-индекс как раз отлично решает эту задачу с AND и OR. Они также специально предназначен именно для случаев, когда количество различных значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как применять? Строим на часто используемые поля BITMAP-индексы и все. Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не хочется с Ораклом связываться. При всем уважении, конечно. Если бы это корпоративный софт был, за который есть кому хорошо заплатить, тогда без вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:27 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
Васисуалий Пупкинсон Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо. Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите. запутался в терминах - я partitioning view имел ввиду, они в стандарт эдишене есть. взрослый оракловый партитионинг как и битмап индексы вам врядле подойдут, они только в ЕЕ редакции, т.е. по $47000 за процессор. у постгреса нет взрослого партитионинга, но есть аналог partitioning view http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html партиции делать на то, что обязательно заполняют, типа пол и город аля женщина-мск, женщина-питер. правда принципиально наверно не решит ... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 20:51 |
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
---|---|---|---|
#18+
On 10.01.2011 20:08, Alexander Ryndin wrote: > BITMAP-индекс как раз отлично решает эту задачу с AND и OR. Это-то да. > Они также специально предназначен именно для случаев, когда количество различных > значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как критерии будем объединять ? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 22:24 |
|
|
start [/forum/topic.php?fid=35&fpage=15&tid=1552724]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 438ms |
0 / 0 |