Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Поиск по EAV / 25 сообщений из 53, страница 1 из 3
29.01.2014, 18:19
    #38542603
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
Я попробовал поискать по этой теме, но в основном сводилось к тому что "EAV плохо, потому что не сделать поиск"
Я с этим не спорю, но у меня как раз проблема что к работающей базе прицепили EAV и мне нужно сделать по нему поиск.

Вот дословные требования из ТЗ, противостоять этому я уже не могу(согласовывалось до меня):
Поиск должен осуществляться как по одному, так и по группе заданных реквизитов/значений реквизитов, а также за заданный пользователем период времени. При этом должны применяться стандартные возможности фильтра: =, !=, >, <, содержит, не содержит, похоже, не похоже и т.д. Должна быть возможность задать список значений, а для реквизитов формата "число", "дата" - задать диапазон значений (период)

Чтобы вы могли предложить (кроме сочувствия)? Может есть какие технологии, другие продукты? Как-то гугл с яндексом же ищут

Таблица сущностей (т.е. к чему атрибуты относятся) порядка 100млн записей, где-то около 100 видов атрибутов, одновременно используется в среднем 10.
Селективность по значениям атрибутов невысокая, т.е. значений относительно немного и нужно как раз накладывать поиск по нескольким видам атрибутов.
Oracle

Заранее благодарен
...
Рейтинг: 0 / 0
29.01.2014, 18:44
    #38542634
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.
...
Рейтинг: 0 / 0
29.01.2014, 18:44
    #38542635
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperЧтобы вы могли предложить (кроме сочувствия)?
А в чём проблема-то? Берёшь список критериев на входе из него формируешь портянку SQL кода
по шаблону
[src]WHERE (Реквизит=:Реквизит1 AND Значение <операция> :Значение1)
OR
(Реквизит=:Реквизит2 AND Значение <операция> :Значение2)
GROUP BY id
HAVING cunt(*) > :Порог нечёткости
ORDER BY count(*) DESC[src]
Естественно, в базе должен быть составной индекс на (Реквизит, Значение).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.01.2014, 19:40
    #38542688
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
проблема что это очень медленно работает
мягко говоря
индекс конечно есть
SERG1257Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.как это поможет? возможно я не понял - какой должна быть вьюха?
...
Рейтинг: 0 / 0
29.01.2014, 19:47
    #38542694
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
Dimitry SibiryakovSergSuperЧтобы вы могли предложить (кроме сочувствия)?
А в чём проблема-то? Берёшь список критериев на входе из него формируешь портянку SQL кода
по шаблону
[src]WHERE (Реквизит=:Реквизит1 AND Значение <операция> :Значение1)
OR
(Реквизит=:Реквизит2 AND Значение <операция> :Значение2)
GROUP BY id
HAVING cunt(*) > :Порог нечёткости
ORDER BY count(*) DESC[src]
Естественно, в базе должен быть составной индекс на (Реквизит, Значение).да, похоже это именно то что мне надо
завтра попробую
спасибо
...
Рейтинг: 0 / 0
29.01.2014, 19:50
    #38542701
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuper какой должна быть вьюха? Скорее не вьюха а вьюхи. У вас есть сущности у них атрибуты: сущность - вьюха, атрибуты - поля, значения - строки.
...
Рейтинг: 0 / 0
30.01.2014, 00:19
    #38542939
R7
R7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
А как вы делаете поиск?
Вьюх нет, значит запросы динамические.
На выходе селект с псевдонимами из названий атрибутов. По атрибутам добавляете критерии.
Разве это совсем медленнее предложенного варианта?
...
Рейтинг: 0 / 0
30.01.2014, 00:43
    #38542947
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
R7А как вы делаете поиск?
Вьюх нет, значит запросы динамические.
На выходе селект с псевдонимами из названий атрибутов. По атрибутам добавляете критерии.
Разве это совсем медленнее предложенного варианта?да, динамический запрос, делается на клиенте
если задан какой-то атрибут, то дописываю во where типа "and exists(...)"
т.к. селективность значений невысокая, то получается что хотя бы один раз надо довольно много просканировать
...
Рейтинг: 0 / 0
30.01.2014, 03:05
    #38542979
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperSERG1257Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.как это поможет? возможно я не понял - какой должна быть вьюха?Oracle, материализованные представления .
Таблицу, в которой сохраняется результат, можно индексировать.
...
Рейтинг: 0 / 0
30.01.2014, 09:39
    #38543100
_мод
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperЗаранее благодарен
Таблица EAV
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
E      varchar2(100)
id_E  varchar2(100)
A      varchar2(100)
V       varchar2(2000)
index E (E,A,id_E)
index V (E,A,V)

--поиск значения по id_E:
select * from EAV where E='E1' and A='A1' and id_E='id_E1'

--поиск по значению:
select * from EAV where E='E1' and A='A1' and V='V1'


ну и динамический SQL c exists или join
...
Рейтинг: 0 / 0
30.01.2014, 09:46
    #38543103
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SERG1257Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.
Если речь о материализванном представлении, то возникнет вопрос про оперативность. Если, к примеру, мат представление обнавляли 10 минут назад, то в запрос не попадут данные знаесенные в БД 5 минут назад.
...
Рейтинг: 0 / 0
30.01.2014, 10:07
    #38543127
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
vadiminfoSERG1257Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.
Если речь о материализванном представлении, то возникнет вопрос про оперативность. Если, к примеру, мат представление обнавляли 10 минут назад, то в запрос не попадут данные знаесенные в БД 5 минут назад.Это зависит от...
В некоторых случаях (и с применением некторых техник) матвью обновляются по коммиту.
...
Рейтинг: 0 / 0
30.01.2014, 10:17
    #38543143
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
sphinx_mvЭто зависит от...
В некоторых случаях (и с применением некторых техник) матвью обновляются по коммиту.
А поскольку обновление в общем случае может занимать время, тем более если одновременно запустят несколько запросов вызывающих обновление мат вьюва, то может опять встать вопрос о производительности.
...
Рейтинг: 0 / 0
30.01.2014, 10:38
    #38543185
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
R7Вьюх нет, значит запросы динамические.
На выходе селект с псевдонимами из названий атрибутов. По атрибутам добавляете критерии.Селективность по отдельному атрибуту маленькая, так что в любом случае будет пересечение нескольких (по числу паараметров поиска) огромных множеств и по крайней мере один скан огромной таблицы.

Так что только превращение EAV в классическую модель с помощью индексированных материализованных представлений, как уже предложил SERG1257
...
Рейтинг: 0 / 0
30.01.2014, 10:41
    #38543187
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
vadiminfoSERG1257Постройте вьюху на ваш EAV, материализуйте и индексируйте ее.
Если речь о материализванном представлении, то возникнет вопрос про оперативность. Если, к примеру, мат представление обнавляли 10 минут назад, то в запрос не попадут данные знаесенные в БД 5 минут назад.это не страшно, но я не понимаю как это может помочь
сделать представление из 100 колонок и каждую проиндексировать? ну я как-то сомневаюсь что мне такое дадут
...
Рейтинг: 0 / 0
30.01.2014, 10:55
    #38543216
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSupervadiminfoпропущено...

Если речь о материализванном представлении, то возникнет вопрос про оперативность. Если, к примеру, мат представление обнавляли 10 минут назад, то в запрос не попадут данные знаесенные в БД 5 минут назад.это не страшно, но я не понимаю как это может помочь
сделать представление из 100 колонок и каждую проиндексировать? ну я как-то сомневаюсь что мне такое дадут
Если речь идет о том чтобы юзер быстро получал ответ на запрос, то, в общем случае, мат вьюв может помочь тем, что Вы какие-то вычисления могут быть произведены заранее (не в запросе юзера). Типа как тут писали, может быть, получить "классическую модель ". Или какие-то таблицы с почти готовым для юзера результатом.
...
Рейтинг: 0 / 0
30.01.2014, 11:15
    #38543259
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
а что значит классическая модель"? таблица со 100 колонками?
в принципе я мог и сразу в такую таблицу писать, но не вижу как это бы мне помогло - неизвестно по каким атрибутам будут делаться запросы и соответственно по каким комбинациям полей делать индекс
...
Рейтинг: 0 / 0
30.01.2014, 11:21
    #38543268
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
_модSergSuperЗаранее благодарен
Таблица EAV
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
E      varchar2(100)
id_E  varchar2(100)
A      varchar2(100)
V       varchar2(2000)
index E (E,A,id_E)
index V (E,A,V)

--поиск значения по id_E:
select * from EAV where E='E1' and A='A1' and id_E='id_E1'

--поиск по значению:
select * from EAV where E='E1' and A='A1' and V='V1'



ну и динамический SQL c exists или joinспасибо, но у меня не настолько все плохо)
...
Рейтинг: 0 / 0
30.01.2014, 11:33
    #38543286
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
я может неправильно объяснил - вобщем-то у меня нет проблем составить запросы, да и структуры я делаю сам
проблема в поиске
если делать в лоб, то ищется десятки минут - получается что нужно сделать пересечение из нескольких множеств порядка 1 млн записей
надо какие-то нестандартные решения
...
Рейтинг: 0 / 0
30.01.2014, 11:50
    #38543315
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
vadiminfosphinx_mvЭто зависит от...
В некоторых случаях (и с применением некторых техник) матвью обновляются по коммиту.
А поскольку обновление в общем случае может занимать время, тем более если одновременно запустят несколько запросов вызывающих обновление мат вьюва, то может опять встать вопрос о производительности.Во-первых, не проверишь - не узнаешь.
Во-вторых, у меня "есть обоснованные подозрения" (с), что матвью даже по коммиту обновляется в фоновом режиме...
Ну, и в-третьих, разрешать пользователям в произвольном порядке выполнять обновление "агромадного" матвью "ручками" - очень нехорошая идея. Вместо этого настриваем интервал обновления - декларативно в DDL этой вьюхи или вызываем по расписанию процедуру обновления.
Хоть вопросы веры здесь не обсуждаются, но я "не верю", что использование матвью создаст критические проблемы производительности оперативных изменений...
...
Рейтинг: 0 / 0
30.01.2014, 11:53
    #38543322
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperесли делать в лоб, то ищется десятки минут - получается что нужно сделать пересечение из нескольких множеств порядка 1 млн записей
надо какие-то нестандартные решенияДо использования "нестандартных решений" попробуйте то, что Вам предложили из "стандартного" - их вполне должно хватить...
...
Рейтинг: 0 / 0
30.01.2014, 11:54
    #38543323
R7
R7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
alexeyvgR7Вьюх нет, значит запросы динамические.
На выходе селект с псевдонимами из названий атрибутов. По атрибутам добавляете критерии.Селективность по отдельному атрибуту маленькая, так что в любом случае будет пересечение нескольких (по числу паараметров поиска) огромных множеств и по крайней мере один скан огромной таблицы.

Так что только превращение EAV в классическую модель с помощью индексированных материализованных представлений, как уже предложил SERG1257
И чем этот подход лучше того, когда мы изначально имеем классическую модель без всяких EAV? Тем, что к каким-то сущностям чаще обращаются?

Тут 2 варианта: либо кушать кактус, либо не кушать кактус.
...
Рейтинг: 0 / 0
30.01.2014, 12:42
    #38543411
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
sphinx_mvВо-вторых, у меня "есть обоснованные подозрения" (с), что матвью даже по коммиту обновляется в фоновом режиме... ...
Не имелось в виду "не фоновость". В общем случае обновление может требовать времени.
И это время как бы должно быть в запросе. Иначе опять не оперативность, но теперь не заметная для юзера. Пользователь получил данные то быстро, но они не актуальны, поскольку последнее обновление еще не закончилось, хотя коммит был выполнен до запроса. Ну и есть риск, что примет не правильное решение, на основе этой инфы. А поскольку мы это знаем, то, возможно, опять столкнемся с производительностью, стремясь это разрулить.

sphinx_mvНу, и в-третьих, разрешать пользователям в произвольном порядке выполнять обновление "агромадного" матвью "ручками"
...декларативно в DDL этой вьюхи или вызываем по расписанию процедуру обновления
Про пользоватей и DDL тоже не имелось ввиду: есть "Джобы" задания по расписанию.

Так или иначе для оперативных запросов, возможно, мат вьювы могут не всегда подойти.
...
Рейтинг: 0 / 0
30.01.2014, 12:45
    #38543420
_мод
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperесли делать в лоб, то ищется десятки минут - получается что нужно сделать пересечение из нескольких множеств порядка 1 млн записей
Откуда множества порядка 1 млн записей ?
Сколько типов сущностей ?
...
Рейтинг: 0 / 0
30.01.2014, 12:52
    #38543437
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по EAV
SergSuperя может неправильно объяснил - вобщем-то у меня нет проблем составить запросы, да и структуры я делаю сам
проблема в поиске
если делать в лоб, то ищется десятки минут - получается что нужно сделать пересечение из нескольких множеств порядка 1 млн записей
надо какие-то нестандартные решения

Поиск по произвольному подмножесnву 100 атрибутов не будет быстрее table scan-а - хоть с "нестандартными решениями", хоть без них.

P.S. Десятки минут для "пересечения из нескольких множеств порядка 1 млн записей" - это многовато.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Поиск по EAV / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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