Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2010 03:49:56

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

NoSQL

Daevaorn
Двумя пожалуйста
А как двумя? По запросу на каждый диапазон, а затем руками слить две выборки?



Офлайн

#2 Окт. 3, 2010 04:20:02

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

NoSQL

zheromo
Если несложно, можно привести пример когда использование startkey/limit неприменимо.
Элементарно. Когда нужно отсортировать документы по двум полям, НО первое поле по возрастанию, а второе по спаданию.

Проблема в том, что ключи в CouchDB можно сортировать только в одну сторону - либо ASC, либо DESC.



Офлайн

#3 Окт. 3, 2010 15:57:36

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

NoSQL

zheromo
map:
function(hdd) {
if (hdd.capacity>= 250 && hdd.capacity<=1000 && hdd.cost>=50 && hdd.cost<=150)
emit(hdd);
}
Daevaorn прав, от такого запроса мало-мальски большая база загнется.
я активно использую map-reduce, и знаю что эта штука сравнимо медленная, map-reduce нужен для других целей, его нужно выполнять только на подготовленных/отсеянных данных.

в данном запросе на каждый объект будет выполняться эта ф-ия, в настоящее время js не быстрее python'a, и в итоге время выполнения этого запроса будет примерно равна тому: если извлечь все объекты из базы и вручную питоном их профильтровать. (это при условии что бд не распределенная и находиться локально)

Отредактировано (Окт. 3, 2010 16:00:14)

Офлайн

#4 Окт. 3, 2010 16:13:21

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

NoSQL

zheromo
В таком случае лучше использовать ORM, например типа Django ORM (под Couch он есть). Когда его не хватит написать вьюшку. С реляционными базами поступают точно также обычно.
Да, мы избавимся от одного недостатка и наткнемся на второй. Реляционные дают 2 возможности: ОРМ с известным ограничением по скорости или native библиотеки. Couch заведомо предлагает более медленный способ работы с базой.
Конечно, на небольших базах на эти нюансы можно не обращать внимания, но обсуждение идет в этой теме как раз по теме больших баз.
zheromo
Пользы от притягивания абстракций реляционный модели к документо-ориентированной практически нет, это просто разные подходы. Соответственно и архитектура приложения будет разной.
Я прекрасно понимаю разницу. В том числе, между моделями использования. Просто сейчас сложилась ситуация, когда для NoSQL СУБД требуются некоторые возможности SQL СУБД, в основном, касающиеся выборки данных.
zheromo
А что - бывает какойто другой непрямой вид доступа?
Для систем, доступных из Интернет,- обычное дело: фронт - БД. Сервер БД расположен в локальной сети и доступен для фронта (и других систем, если это не ограничено политикой безопасности), снаружи он не виден.



Офлайн

#5 Окт. 3, 2010 21:57:18

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

o7412369815963
zheromo
map:
function(hdd) {
if (hdd.capacity>= 250 && hdd.capacity<=1000 && hdd.cost>=50 && hdd.cost<=150)
emit(hdd);
}
Daevaorn прав, от такого запроса мало-мальски большая база загнется.
я активно использую map-reduce, и знаю что эта штука сравнимо медленная, map-reduce нужен для других целей, его нужно выполнять только на подготовленных/отсеянных данных.

в данном запросе на каждый объект будет выполняться эта ф-ия, в настоящее время js не быстрее python'a, и в итоге время выполнения этого запроса будет примерно равна тому: если извлечь все объекты из базы и вручную питоном их профильтровать. (это при условии что бд не распределенная и находиться локально)
Он имел в виду использование временных вьюх - котрые действительно работают очень медленно и нужны только для разработки. При использовании постоянной вьюхи ничего плохого не произойдет, так как функция выполняется только при вставке или модификации документа. Тотже mysql тоже создает и обновляет индексы. Кстати, никто не мешает писать вьюхи на Python или на C++.

По этому поводу ссылка на бенчмарк
http://metalelf0dev.blogspot.com/2008/09/mysql-couchdb-performance-comparison.html

Особо интересен слайд 6 - видим что при втором и далее запросах времена чтения одинаковы, это и понятно - BTree деревья везде одинковые.
Еще не учитывалось что на один документ Couch-a может приходится несколько записей в MySQL.



Офлайн

#6 Окт. 3, 2010 22:06:49

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

Daevaorn
Вы лукавите, делать подобного рода запрос через временную вьюшку равносильно самоубийству на мало-мальски большой базе. А статически вы просто не сможете сгенерировать ключи по которым можно было бы выбрать нужные документы оним запросом (конечно, если мы говорим о ситуации когда границы задаются динамически). Двумя пожалуйста.

Кстати, для подобного рода запросов более эффективно использовать couchdb-lucene.
Естественно вьюха должна быть постоянная. Для динамических диапазонов полностью согласен - ключ должен быть один - для одного запроса. Есть конечно варианты привидения нескольких ключей к одному - например то же geohash. Также ситуация упрощается если часть ключей перечислима полностью - например марки товаров, их цвета, те же варианты объема винтов, диагонали мониторов и т.д. Тогда тоже можно уложиться в один запрос.



Офлайн

#7 Окт. 3, 2010 22:34:36

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

zheromo
Кстати, никто не мешает писать вьюхи на Python или на C++.
Это практически никак не скажется на производительности.

Самое накладное в текущей схеме индексирования в CouchDB – это энкодинг/декодинг JSON'а.

Это проблему может только отчасти решить написание вьюх на самом эрланге, но это очень неудобно из-за языка.



Офлайн

#8 Окт. 3, 2010 22:44:38

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

dimabest
zheromo
Если несложно, можно привести пример когда использование startkey/limit неприменимо.
Элементарно. Когда нужно отсортировать документы по двум полям, НО первое поле по возрастанию, а второе по спаданию.

Проблема в том, что ключи в CouchDB можно сортировать только в одну сторону - либо ASC, либо DESC.
Это не совсем так
см. https://issues.apache.org/jira/browse/COUCHDB-158

Т.е. можно сортировать по элементам составного ключа.



Офлайн

#9 Окт. 3, 2010 22:53:27

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

zheromo
Это не совсем так
см. https://issues.apache.org/jira/browse/COUCHDB-158

Т.е. можно сортировать по элементам составного ключа.
Нет. Этот тикет тоже не разрезолвлен.



Офлайн

#10 Окт. 3, 2010 23:24:06

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

NoSQL

Daevaorn
zheromo
Это не совсем так
см. https://issues.apache.org/jira/browse/COUCHDB-158

Т.е. можно сортировать по элементам составного ключа.
Нет. Этот тикет тоже не разрезолвлен.
Как я понял, существует патч, который решает данный вопрос. А в официальном коде его нет.
Разработчики считают что кому нужен данный функционал - применят патч сами.

Также есть например еще и
http://github.com/assembly/couchdb-footrest



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version