powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
25 сообщений из 109, страница 1 из 5
EAV с возможностью быстрой выборки по сложным условиям
    #37050668
Здравствуйте! Прошу совета, ибо уже сломал голову пытаясь решить задачу.
Нужно сделать поиск по пользователям сайта.
У пользователей могут быть указаны некоторые атрибуты (число возможных атрибутов 200-300).
В основном эти атрибуты не имеют значений, а являются, по сути, просто флагами (например, "есть борода").
Но есть и атрибуты со значениями (например, "рост" - "185").
Реально каждому пользователю присваивается порядка 5-50 атрибутов.
Количество пользователей - сотни тысяч. Но нужно иметь уверенность, что это сможет быть без проблем смасштабировано еще на пару порядков.

Таким образом, вроде бы, эта задача идеально ложится на Entity-attribute-value модель.
В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутами, но поддержка решения при этом заметно усложняется (особенно учитывая, что оно должно работать в режиме 24/7, а новые виды атрибутов появляются довольно часто). Да к тому же индексирование каждой из этих колонок тоже повлечет свои проблемы.

В общем, типовой use case - это выборка пользователей, подпадающих под заданные критерии.
Критериев может быть указано довольно много (от единиц до десятков), нужно поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.
И трудность заключается в том, что это должно работать быстро. Для рядовых запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго).

Я пробовал моделировать это на Postgres, для 100 тыс. пользователей, для запросов по нескольким критериям работает конечно нормально. Но при увеличении количества критериев в запросе быстро умирает, даже при оптимизации по самые помидоры.
SQL Server заметно более шустрый, но все равно, большое количество критериев быстро обработать не получается.

Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050678
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы (они отлично подходят под ваши условия). Возможно, что разделил таблицу для запросов и таблицу для добавления новых данных. Таблицу для запросов бы периодически перестраивал.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050971
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.
Запросы в Оракле вполне приемлемо работают через банальные GROUP BY ... HAVING COUNT(*)=..., а вот для MySQL пришлось покумекать над оптимизацией.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050975
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно еще попробовать indexed view или взрослый партитионинг по юзер ид.
имхо ничего лучше реляционной субд для такой задачи не найти
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050983
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!взрослый партитионинг по юзер ид.Ну если только по достаточно крупному диапазону (например, с шагом в тысячу или десять тысяч). Иначе ораклоиды не одобрят - 9963426 .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote:

> Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база,
> но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый

Кто тебе мешает использовать гибрид обычной реляционной БД с EAV ?

Важные атрибуты -- в виде обычных колонок таблиц, остальные, дополнительные -- в
виде EAV.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051003
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 8:24, Alexander Ryndin wrote:

> В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы
> (они отлично подходят под ваши условия). Возможно, что разделил таблицу для

Они вообще мало подо что подходят. Да и вообще они не индексы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051072
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 8:24, Alexander Ryndin wrote:

> В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы
> (они отлично подходят под ваши условия). Возможно, что разделил таблицу для

Они вообще мало подо что подходят. Да и вообще они не индексы.
Аргументы?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051134
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная задачка. Поддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051151
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.

+1. Решение, оправдавшее себя многолетней практикой.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051247
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 15:15, Alexander Ryndin wrote:

> Они вообще мало подо что подходят. Да и вообще они не индексы.
>
> Аргументы?

Аргументов не будет. Так же, как и флейма на тему "Занахрена кому
нужны битмап-индексы".
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051256
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote:
> Критериев может быть указано довольно много (от единиц до десятков), нужно
> поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.

Сторонники решения проблемы с помощью битмап-индексов могут рассказать
автору топика о том, как они собираются применять эти индексы для
вышепроцитированой задачи.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051261
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051303
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

Найли тут iv_an_ru. У него как раз подобные психованные запросы на virtuoso обрабатываются.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051458
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
select count(*) from del.a where 
(
  a in ( 1 , 78 ) 
  and year(c) between year(current_date)- 5  and year(current_date) 
  and d= 0 
) or b like '%75%'
На моих данных запрос отрабатывает <1с. (результат - 39734 записей)
Васисуалий ПупкинсонТут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал.Если без SQL, то посмотрите здесь .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051459
miksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.

Сейчас в таблице есть три поля:
attribute_id int
value int
user_id int

Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051468
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-индексы и все.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051469
Yo.!можно еще попробовать indexed view или взрослый партитионинг по юзер ид.
имхо ничего лучше реляционной субд для такой задачи не найти

Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.
Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051470
pkarklinGgg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.

+1. Решение, оправдавшее себя многолетней практикой.

Спасибо, попробую поэкспериментировать с этим.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051478
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..


Как-то с ходу не очень понятно как их прикрутить-то с таким прицелом...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051489
MasterZivА типовые запросы можно увидеть ?

Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно
проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность
тут вообще ни при чём.

А NOT IN вообще очень тяжёлая операция.


Типовой запрос с AND и OR например такой:

женщина
И
город - С.Петербург
И
не замужем
И
цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба)
И
цвет волос - блондинка
EXCLUDE
курит

Насчет NOT IN - тут может быть несколько облегчает задачу то, что это условие можно накладывать в самом конце, на то, что уже выбрано предыдущими операторами. Т.е. в теле основного запроса этих ограничений встечаться не будет.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051498
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-индексы и все.

Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не хочется с Ораклом связываться. При всем уважении, конечно. Если бы это корпоративный софт был, за который есть кому хорошо заплатить, тогда без вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051518
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Васисуалий Пупкинсон
Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.
Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите.

запутался в терминах - я partitioning view имел ввиду, они в стандарт эдишене есть. взрослый оракловый партитионинг как и битмап индексы вам врядле подойдут, они только в ЕЕ редакции, т.е. по $47000 за процессор.
у постгреса нет взрослого партитионинга, но есть аналог partitioning view
http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html

партиции делать на то, что обязательно заполняют, типа пол и город аля женщина-мск, женщина-питер. правда принципиально наверно не решит ...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051615
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 20:08, Alexander Ryndin wrote:

> BITMAP-индекс как раз отлично решает эту задачу с AND и OR.

Это-то да.

> Они также специально предназначен именно для случаев, когда количество различных
> значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.

Как критерии будем объединять ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 1 из 5
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]