Форум сайта python.su
name23 http://daisovet.ru - такая штука где люди делятся всяческими проблемами и их решают)
сделано на пилонах.
и не будет а есть вроде как, но переделки требует (ибо я быдлокодер как выяснилось xDDDD)
P.S. за что платят - то и делаю)))
Отредактировано (Сен. 6, 2010 15:07:02)
Офлайн
Всем здравствуйте!
Почитал эту и еще несколько веток, касающихся CouchDB и решил зарегистрироваться :)
Обидно стало за то, что некоторые товарищи не разобравшись до конца в теме делают скорополительные выводы по поводу применимости технологии для тех или иных задач.
Касается это высказыванию что “CouchDB умеет делать только совсем простые выборки” и так далее
Нужно понимать что работа с CouchDB несколько отличается от работы с обычными реляционными базами (в этом плане освоение Mongo намного проще). Для меня тоже вначале казались неразрешимыми задачи сделать более менее серьезную выборку в Couch, пока я не понял как работает map/reduce и представления (views). С помощью них можно сделать сколь угодно сложную выборку. Поэтому если не получается что-то сделать, не значит что этого сделать нельзя.
Ключ может состоять из нескольких значений документа, в том числе быть результатом вычислений над ними - поэтому высказывание, что выборку можно делать по одному диапазону необосновано.
По поводу паджинации не думаю что view(_view_name, skip=N, limit=M) намного сложнее чем SELECT … LIMIT … Еще эффективней работает view(_view_name, start_key=S, limit=M). И БД не загнется :)
Сам использую CouchDB в продакшене - поэтому могу высказать свое мнение по некоторым аспектам использования:
лучше действительно сразу запршивать документ из базы напрямую, так как все равно придется отдавать результат через HTTP, почему не сделать этого сразу. Couch нормально отдает и статику (аттачи к документам) с поддержкой If-Modified ETag и прочими прелестями, включая и gzip сжатие.
С авторизацией там также все нормально, есть и сесиии и OAuth и т.д.
Так что можно разрешить и запись каким либо пользователям, а если планируется только чтение - то вообще нет никаких проблем.
Офлайн
zheromoЯ думаю что имелось ввиду отсутствие возможности в одном запросе указать несколько пар startkey/endkey.
что выборку можно делать по одному диапазону необосновано.
zheromoskip/limit не эффективны и для паджинации не рекомендуются. А startkey/limit не всегда преименимо.
По поводу паджинации не думаю что view(_view_name, skip=N, limit=M) намного сложнее чем SELECT … LIMIT … Еще эффективней работает view(_view_name, start_key=S, limit=M). И БД не загнется :)
Офлайн
zheromoПроблема CouchDB в том, что для любого чиха приходится делать свою map-функцию. Т.е. изобретать велосипед, в то время как другие этот минимальный функционал уже предоставляют “из коробки”. В наше время часы программиста стоят дорого, поэтому от велосипедов отказываются.
Для меня тоже вначале казались неразрешимыми задачи сделать более менее серьезную выборку в Couch, пока я не понял как работает map/reduce и представления (views). С помощью них можно сделать сколь угодно сложную выборку. Поэтому если не получается что-то сделать, не значит что этого сделать нельзя.
Офлайн
zheromoНу-ну. Давай начнем с простой.
С помощью них можно сделать сколь угодно сложную выборку
Офлайн
LexanderВ таком случае лучше использовать ORM, например типа Django ORM (под Couch он есть). Когда его не хватит написать вьюшку. С реляционными базами поступают точно также обычно.zheromoПроблема CouchDB в том, что для любого чиха приходится делать свою map-функцию. Т.е. изобретать велосипед, в то время как другие этот минимальный функционал уже предоставляют “из коробки”. В наше время часы программиста стоят дорого, поэтому от велосипедов отказываются.
Для меня тоже вначале казались неразрешимыми задачи сделать более менее серьезную выборку в Couch, пока я не понял как работает map/reduce и представления (views). С помощью них можно сделать сколь угодно сложную выборку. Поэтому если не получается что-то сделать, не значит что этого сделать нельзя.
Вы можете аргументировать свою точку зрения, например, добавив свою колонку по CouchDB в эту табличку: http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart ?
Ну и интерфейс доступа к базе (REST API) сравнительно медленный и ориентирован на специфические приложения. Архитектура CouchDB рассчитана на прямой доступ к БД извне, грубо говоря.
Офлайн
dimabestmap:zheromoНу-ну. Давай начнем с простой.
С помощью них можно сделать сколь угодно сложную выборку
Интересуют жесткие диски объемом от 250 Гб до 1000 Гб и по цене от 50 до 150 у.е.
Как сделать выборку?
function(hdd) {
if (hdd.capacity>= 250 && hdd.capacity<=1000 && hdd.cost>=50 && hdd.cost<=150)
emit(hdd);
}
HDD.objects.filter(capacity__gte=250,capacity__lte=1000, cost__gte=50, cost__lte=150)
Офлайн
DaevaornЭто тоже можно сделатьzheromoЯ думаю что имелось ввиду отсутствие возможности в одном запросе указать несколько пар startkey/endkey.
что выборку можно делать по одному диапазону необосновано.zheromoskip/limit не эффективны и для паджинации не рекомендуются. А startkey/limit не всегда преименимо.
По поводу паджинации не думаю что view(_view_name, skip=N, limit=M) намного сложнее чем SELECT … LIMIT … Еще эффективней работает view(_view_name, start_key=S, limit=M). И БД не загнется :)
Офлайн
zheromoЯ слежу за этим тикетом. Он ещё не разрезолвлен и данного вида запрос сделать пока нельзя.
Это тоже можно сделать
{ “ranges”: }
ссылка
https://issues.apache.org/jira/browse/COUCHDB-523
zheromoНапример когда вьюха может генерировать одинаковые ключи. Для паджинации в данном случае требуется использование ещё и startkey_docid, но это тоже не будет работать если одинаковые ключи может порождать один документ.
Если несложно, можно привести пример когда использование startkey/limit неприменимо.
Офлайн
zheromoВы лукавите, делать подобного рода запрос через временную вьюшку равносильно самоубийству на мало-мальски большой базе. А статически вы просто не сможете сгенерировать ключи по которым можно было бы выбрать нужные документы оним запросом (конечно, если мы говорим о ситуации когда границы задаются динамически). Двумя пожалуйста.
map:или на ORM примерно такfunction(hdd) {
if (hdd.capacity>= 250 && hdd.capacity<=1000 && hdd.cost>=50 && hdd.cost<=150)
emit(hdd);
}HDD.objects.filter(capacity__gte=250,capacity__lte=1000, cost__gte=50, cost__lte=150)
Офлайн