powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
25 сообщений из 109, страница 3 из 5
EAV с возможностью быстрой выборки по сложным условиям
    #37052104
ikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ikk
Гость
Да и вообще, для поиска можно (и даже нужно) использовать тот же Sphinx.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052191
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit Выше я приводил пример запроса для миллиона записей.

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

ПС. возможно, вы меня поправите, насколько мне известно, в США самая большая база обслуживает 4 млн ветеранов, на мой взгляд, это немного и у меня нет достоверной информации о том, что база используется в более масштабных нагруженных проектах
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052250
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонmiksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.Сейчас в таблице есть три поля:
attribute_id int
value int
user_id int

Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные..."нормализованные" - вынесенные в отдельную табличку-справочник.
Т.е. таблички получатся примерно такие:
Основная таблица:
user_idattribute_value_id
Справочник значений атрибутов:
attribute_value_idattribute_idvaluedisplay_order
Справочник атрибутов:
attribute_idattributedisplay_orderЕсли атрибуты могут быть иерархическими, то в последнюю таблицу еще нужно добавить поле для указания родительского атрибута.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052294
DPH3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонЕсли нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.

Ну, можно посмотреть на бесплатный DB2 Express C, по идее задача как раз для него.
Но вот оперативки в бесплатной лицензии может оказаться маловато - тут надо пробовать.
Зато оптимизатор хороший :)
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052315
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 20:08, Alexander Ryndin wrote:

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

Это-то да.

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

Как критерии будем объединять ?
Сам-то понял, что спросил?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052832
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

По одному критерию по его полю строим индекс (хотя бы и битмап), получаем
быстрый поиск записей по этому критерию. Критериев много. Нужно найти
пересечение множеств записей, удовлетворяющих каждому критерию.
Как это делать ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052839
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 2:21, Васисуалий Пупкинсон wrote:

> Тогда правильный пример будет таким:
>

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

И тебе придётся таки трахаться с OR.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052842
Deadman2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052847
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 3:11, SERG1257 wrote:

> Я бы начал с этого варианта не связываясь с EAV. Пустые значения хранится не

Да пока проблема-то не в нём.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052850
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 4:16, pilot911 wrote:
> если так - то запрос должен выполняться очень быстро даже на миллионах записей

Что заставляет тебя так думать ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052872
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

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

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052878
а такс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
И тебе придётся таки трахаться с OR.




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Where пол = 'женщина'
  and город = 'С.Петербург'
  and семья = 'не замужем'
  and цель знакомства in ('брак','романтические отношения','дружба')
  and цвет волос = 'блондинка'
  and курение is null

[/quot]
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052887
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а такс,

вообще говоря, in==or
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052916
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..
Очччень интересно было бы почитать, каким образом R-tree помогает селекать по куче атрибутов и вообще, как GIS относится к проблеме. Вот даже просто.... что-то типа "кажется, именно философия Канта призвана бороться со смертностью детей в Африке".
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052922
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ApexMasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

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

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...Ага точно. Star Transformation Query. Упрощенно описано в документации .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052940
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ тебе придётся таки трахаться с OR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
create table test_bm 
as 
select rownum id
   , trunc(dbms_random.value( 100 , 210 + 1 )) height 
   , trunc(dbms_random.value( 16 , 100 + 1 )) age 
from dual 
connect  by level <= 100000 ;

create bitmap index tesT_bm#height on test_bm(height);
create bitmap index tesT_bm#age on test_bm(age);

explain plan for
select * 
from tesT_bm 
where height between  165  and  175  or age between  18  and  25  and age !=  22 ;

select * from table(dbms_xplan.display());

Plan hash value:  1289150775 
 
-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|    0  | SELECT STATEMENT             |                |  16978  |   646K|     29    ( 0 )|  00 : 00 : 01  |
|    1  |  TABLE ACCESS BY INDEX ROWID | TEST_BM        |  16978  |   646K|     29    ( 0 )|  00 : 00 : 01  |
|    2  |   BITMAP CONVERSION TO ROWIDS|                |       |       |            |          |
|    3  |    BITMAP OR                 |                |       |       |            |          |
|    4  |     BITMAP MERGE             |                |       |       |            |          |
|*   5  |      BITMAP INDEX RANGE SCAN | TEST_BM#HEIGHT |       |       |            |          |
|    6  |     BITMAP MERGE             |                |       |       |            |          |
|*   7  |      BITMAP INDEX RANGE SCAN | TEST_BM#AGE    |       |       |            |          |
-----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
    5  - access("HEIGHT">= 165  AND "HEIGHT"<= 175 )
    7  - access("AGE">= 18  AND "AGE"<= 25 )
       filter("AGE"<> 22 )
 
Note
-----
   - dynamic sampling used for this statement (level= 2 )
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerОчччень интересно было бы почитать, каким образом R-tree помогает селекать по куче
атрибутов и вообще, как GIS относится к проблеме.

Понятия не имею, но вот есть один аффтар настаивает:
http://tech.groups.yahoo.com/group/Firebird-Architect/message/11369
http://tech.groups.yahoo.com/group/Firebird-Architect/message/11381
Утверждает, что запрос с кучей index range scan по разным B-tree индексам сливает, а
R-tree рулит со страшной силой.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053098
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПонятия не имею, но вот есть один аффтар настаивает:
Боюсь, эти ссылки без регистрации показывают пустой экран.

Мм... настаивать он может сколько угодно. В принципе, конечно, R-tree действительно рулит, но только есть два момента: во-первых, оно рулит для поиска объектов, обладающих протяжённостью (то есть для запросов вида "покажи мне отрезки, хоть насколько-то пересекающиеся с отрезком (A, B)") а во-вторых, сколь мне помнится, многомерные R-индексы требуют задания всех атрибутов (ну или ведущих в списке - в общем аналогично B-tree).
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerнастаивать он может сколько угодно

Ну, он там приводит в пример как запрос класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
where
x1_y1 >= <#randomnumber1> -  20  and
x1_y1 <= <#randomnumber1> +  20  and
x1_y2 >= <#randomnumber2> -  20  and
x1_y2 <= <#randomnumber2> +  20  and
x1_y3 >= <#randomnumber3> -  20  and
x1_y3 <= <#randomnumber3> +  20  and
x1_y4 >= <#randomnumber4> -  20  and
x1_y4 <= <#randomnumber4> +  20  and
x1_y5 >= <#randomnumber5> -  20  and
x1_y5 <= <#randomnumber5> +  20 ;
выполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree
индексами при числе записей в таблице на уровне десятков миллионов. Условия в этом запросе
мне сильно напомнили то, что говорит ТС, поэтому я и посоветовал ему обратить внимание на GiS.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053197
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovвыполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree
Дык неудивительно. Но стоит выкинуть условие на какую-либо координату, и R-индекс займётся оральным сексом, что топикстартера вряд ли порадует :) Собственно, именно этот запрос и в случае аналогичного B-индекса cкорее всего неплохо отработает, и проявит бОльшую к выкидыванию не-первых координат.

Суть r-индекса показана здесь .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053310
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо за приличные деньги использовать Oracle с bitmap indexes, либо эксперименитровать с PostgreSQL R-tree indexes. Оракловская имплементация R-tree индекса здесь бесполезна, поскольку ограничена 4 измерениями. У PostgreSQL такого искусственного ограничения вроде нет, но R-tree индексы жрут немерянно памяти, и я очень сомневаюсь наскольку эффективно они будут работать для вырожденных запросов (пропущенные измерения). Должно также сильно тормозить на вставку/модификацию.
Попробуйте найти open source базу с поддержкой bitmap indexes. LusidDB вроде умеет это делать, но опять же это только для чтения.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053327
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглил немножко, интересно стало. Похоже, что R-tree индексы быстро теряют в производительности при росте числа измерений, и при 10-20 измерениях full scan для поиска данных становится быстрее ( и проще :^) )
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053341
SergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?

Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053387
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

Без EAV 100т строк с заполненными 50 полями (~1000байт) по объему 100МБ будет сидеть в кеше. Фулскан будет занимать миллисекунды.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053435
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

если вы использовали PostreSQL, то пробовали ли вы реализацию через GIN-индекс на intarray/hstore? Можно даже поверх 10052526 , а можно и без.

F.15. intarray
F.13. hstore

F.15.1. intarray Functions and OperatorsThe @@ and ~~ operators test whether an array satisfies a query, which is expressed as a value of
a specialized data type query_int. A query consists of integer values that are checked against the
elements of the array, possibly combined using the operators & (AND), | (OR), and ! (NOT). Parentheses
can be used as needed. For example, the query 1&(2|3) matches arrays that contain 1 and also
contain either 2 or 3.
для старта можно попробовать заиспользовать intarray для хранения ссылок на значения.
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 3 из 5
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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