27.07.2010 - 22:44
MongoDB

Два проекта на Pylons и MongoDB готово. Теперь вполне можно поделиться впечатлениями от нереляционных БД и монго в частности. Статей по тому, что скрывается под страшными словами нереляционная база данных в интернетах уже хоть попой ешь, поэтому не хочу вдаваться в терминологию. Объясню на реальных примерах и, так сказать, чтобы даже моя жена поняла.

В "обычном" приложении в реляционных БД данные представлены в виде таблицы, которая состоит из столбцов и строк. Думаю, прайс-лист в магазине все видели - типичный пример. Пойдем дальше - у нас есть много таблиц. Например, новости и их категории. Настоящие поцаны, прочитавшие первые 100 страниц книжки по реляционным БД знают, что новости и названия их категорий нужно хранить в разных таблицах. В таблице новости хранить, собственно, ID новости, название, саму новость и ID категории, а в таблице категорий хранить ID категории и название категории. Опять же в простейшем случае. В запросе выбирать из двух таблиц, чтобы получить и новость и название категории. Это называется JOIN. Все удобно, красиво и очевидно. Другие крутые поцаны придумали язык SQL, который позволяет легко это делать.

А теперь представим, что к новости нужны теги. Это еще одна таблица тегов. У новости может быть много тегов. Это еще одна таблица соотношений новость-тег. А к новости нужны комментарии. Еще таблица комментариев. Один запрос обрастает 10 JOIN'ами с другими таблицами. А каждый JOIN на низком уровне - это довольно дорогостоящий как по памяти так и по процессору цикл foreach. А затем заказчик сказал, что категория может быть не одна, а много. Нам придется перекраивать отношения между двумя таблицами, изменять все запросы. Если мы используем ORM, придется переписывать и перекомпилировать схемы БД. Тут начинается настоящий SQL'ный ад. ORM, конечно, немного спасает от этого, потому что не приходится искать все запросы к этой таблице по всему приложению.

От этого никуда не деться при написании больших систем. Там просто постоянно нужны отношения между таблицами. Но, например, когда мы пишем простой сайт наши запросы обычно не сложнее одного-двух JOIN'ов, из которых половина вообще вынужденная. Просто потому что "так правильно". Мы все так привыкли, но есть совершенно другой подход...

Есть такой формат как JSON. Пошел он от языка JavaScript, потому что там каждый объект является массивом своих методов и данных. Соответственно, в простейшем случае, JSON-данные можно (но лучше не надо) прогнать через eval() и получить JS-объект (массив). Выглядит это просто:

{

name: "V@s3K",

sex: "male",

hands: {

left: True,

right: True,

},

penis: "8===>",

}

То есть у нас есть массив типа ключ-значение, в котором значения тоже могут быть такими же массивами, либо строками, числами, объектами. Собственно таблица в MongoDB представляет из себя массив таких массивов и называется коллекция. Всем известно как получить, например, имя третьего человека в такой коллекции. collection[3]["name"]. Ну вот... это всё :D Это и есть нереляционные БД. Один большой массив. Для меня самым приятным в этом было то, что у записи нет определенной схемы. То есть я могу к одному юзеру добавить поле address, не добавляя его всем остальным. В SQL так нельзя, все-таки таблица.

Теперь о самом MongoDB. Почему именно он? Для меня тут все просто:

CouchDB написан на Erlang'е. Это снижает мой интерес к ней до нуля.

Cassandra слишком document-oriented. Отлично подходит только под узкий круг задач.

MongoDB же написан на С++, что внушает мне доверие, а так же имеет куда более больший круг задач.

Главным тут является язык запросов. Для тех, кто знаком с SQL очень полезной будет ссылка о соответствии запросов SQL и MongoDB: http://memo.undr.su/2010/01/27/sootvetstvie-mysql-i-mongodb-zaprosov/

Мне, если честно, чтобы освоить синтаксис запросов полностью хватило этой странички.

В простейшем случае запрос выглядит как: db.news.find()

Соответственно, news - название коллекции, a find() вернет все записи из коллекции.

Если нам нужно условие (что чаще всего и нужно): db.news.find({ "name": "V@s3K" })

Выберет всех юзеров с именем V@s3K

Сортировка? Проще простого: db.news.find({ "name": "V@s3K" }).sort({ "penis": -1 })

Отсортирует юзеров с именем V@s3K по пенису по убыванию (-1 - убывание, 1 - возрастание).

Ограничить? Тогда db.news.find({ "name": "V@s3K" }).sort({ "penis": -1 }).limit(5)

Очень нравится то, что если у нас есть поле с массивом типа categories: [ "Одна", "Вторая" ], можно легко выбрать запросом: db.news.find({ "categories": "Одна" }) все записи, содержащие эту категорию в массиве.

Вернет 5 записей.

Хотим любимый и быстрый SELECT COUNT()? Тогда: db.news.find().count({ "name": 1 }). Посчитает все записи, где name - не пустой.

Все остальное - в документации: http://www.mongodb.org/display/DOCS/Developer+Zone

Философия mongo диктует нам использовать вложенные массивы, когда мы бы использовали JOIN в SQL. То есть список категорий надо делать не отдельной таблицей, а вставлять массивом в поле categories у каждой новости. Если привыкнуть к этому, становится очевидно и странно, почему раньше так не делал. Можно создавать целые огромные коллекции, например, коллекция пользователей, у каждого из которых массив его новостей, у каждой новости массив комментариев к ней (или у пользователя, в зависимости от наших нужд). Вместо минимум 3 таблиц на SQL, у нас 1 коллекция mongo. Не агитирую так делать всегда, например мне в блоге было удобнее все-таки разделить коллекцию постов и комментариев для удобства редактирования-удаления последних. Тут как и везде: возможности хороши только когда они обоснованы.

О производительности. При сборке из исходников вы бы заметили, что MongoDB написан на С++ и активно использует библиотеки boost. Уже хорошо. БД хранятся в отдельных файлах в указанной в настройках директории. Формат файлов - BSON (бинарный JSON). Размер всегда - ровно степень двойки. Например, под мой блог монго выделила 64 мегабайта, для магазина увеличила до 128. Вот такой вот формат. На 32-битной машине поддерживается максимально только 2-гигабайтную коллекцию. Разработчики рекомендуют 64-битные ОС для больших баз, чтобы не упереться в это ограничение. Храние всей базы в одном бинарном файле очень облегчает бекап и переносимость. В состоянии ожидания демоны серверов mongod и mysqld жрут одинаково, при запросах активно тредятся и форкаются, но по личным наблюдениям процессы mysql в топе я вижу чаще, чем mongo. То есть CPU при штатном использовании монго жрет меньше. Довольно странный и очень субъективный обзор-сравнения есть на хабре: http://habrahabr.ru/blogs/mysql/87620/

Видим, что mongo у поцана не дает больше на выборках (~20K/сек у mysql против ~15K/сек у монго), но всегда обходит на вставках (разгоняется аж до 60К записей в секунду). Видим, что границы разгона MongoDB ограничены так же нечетко, как всех остальных СУБД, там даже 160К в секунду получилось случайно. Подробности в обзоре, но нужно здраво оценивать, что все статьи, что монго "в 100 раз быстрее" - не более, чем рекламный ход и синтетические тесты. В других тестах я замечал, что и показатель отказов у монго выше (99% против 94%) и скорость в два раза больше. У третьих получалось наоборот, монго была в четыре раза медленнее. Все равно любой адекватный человек знает, что сравнивать базы - дело очень многогранное и сложное. Зависит не только от настроек, но и от конфигурации сервера, расположении баз на диске, от тысячи факторов. Кому интересно, наберите в гугле "MongoDB vs MySQL" и полюбуйтесь как у разных людей получались совершенно разные и совершенно синтетические результаты. У первого стояли чистые серверы без настроек. У последнего явно распараллеленный MySQL-сервер с хорошими настройками и чистый Mongo. Да еще и в конце автор сознается, что использовал кеш для MySQL. Короче - бред.

Из личных (то есть чисто субъективных и необоснованных) заметок: монго любит параллелиться из коробки и лучше будет использовать мои 4 ядра по 5%, чем одно на 20%. Монго любит хранить часто используемые данные в памяти, чтоб не читать каждый раз. Мы получаем настоящий memcache из коробки. А так же я ни разу не наблюдал как какой-то запрос по непонятным причинам может выполняться десяток секунд. Или я один замечал, что некоторые запросы в phpmyadmin ВНЕЗАПНО выдают "время выполнения: 16,434 сек"?

В общем я не разочарован в MongDB, хотя по началу очень старался избегать моды на NoSQL, считая это чем-то вроде холивара. После использования NoSQL я могу сказать, что у него несколько другая область применения. Теперь я не чувствую, что колю орехи ядерным взрывом, когда пишу SELECT * FROM `news`. Какая-то легкость в руках что-ли. Вот монго помогает именно в таких "простых" случаях. И нет, я не собираюсь обсуждать что лучше, а что хуже. Я пользуюсь и тем и тем.

А из замеченых минусов:

- ID объектов хранятся как закодированное мясо (набор из штук 15 символов). Сделано это для удобства кластеризации (не нужно следить за индексацией на разных серверах, очень ускоряет запись), но у этого подхода главный минус - привычный каждому auto increment делается через неприятное место. В реляционных БД внутри то же самое, только там это уже сделано и через то же место (таблицу индексов).

- Встроенный механизм DBRef, позволяющий (да-да) выполнять самые настоящие JOIN'ы между коллекциями, довольно не очевиден для такой простой БД. Точнее даже не он сам, а его реализация в библиотеках. Именно поэтому я никогда не использовал его в приложениях. Раз уж отказываемся от отношений, то до победного конца. Без костылей. Чаще всего я просто заменяю отношение на включение документа как значение.

- Херовая интеграция. Для 90% читающих будет как выстрел в голову. Связана с молодостью монго. В тех же pylons или django при использовании встроенного ORM или SQLAlchemy мы получаем так же плюшки в виде автоматической генерации и валидации форм, админок и другого безобразия. Тут же пока даже популярные библиотеки (я использую mongokit для питона) грешат костылями, что уж говорить об автогенерации чего-либо. Приходится как-то выкручиваться и учить старые форм-валидаторы новым танцам. А самые ленивые пользователи django, так привыкшие, что пол сайта генерируется за них самостоятельно, вообще начинают плеваться какашками, когда им говоришь, что на админку придется потратить больше, чем 0 строк кода. Я для таких даже название придумал: дитя фреймворков. Мне так жалко, когда человек теряется в гугле на пол дня со словами "а как я буду писать авторизацию, за меня всегда это джанга делала". Мой РНР-шный опыт все-таки иногда пригождается :)

- Ну и последний и очевидный недостаток, который не относится монго, но важен, так это то, что с ним нет хостингов. Если вы или ваш клиент нищеброд без VDS или своего сервера - использовать в продакшене не получится. А так: "бесплатный хостинг РНР + MySQL скачать без регистрации".

Summary

Итак. Для чего лучше подходит MongoDB:

+ Когда нам нужен простой дизайн

+ Когда число записей в разы превышает число чтений

+ Когда нам нужно активное распараллеливание

+ Когда нам уже не хватает распараллеливания и нужна кластеризация

А для чего SQL:

+ Огромные запросы на выборку разных наборов данных с их аналитикой

+ Когда нам нужно хранить изначально табличные данные

+ Когда нам нужна высокая стабильность и защищенность от потери данных, если уборщица выключит компьютер из розетки. В монго над этим только начали работать. (Говоря стабильность, я не имею ввиду обиду от потери БД пользователей или последних двух комментариев вашего бложека, я говорю о настоящих больших вещах).

+ Чтобы похапешники могли зарабатывать на говносайтах

P.S.: Никого не агитирую резко меняться, куда-то бежать, что-то ставить. Просто поделился тем, что для меня MongoDB был как глоток свежего воздуха. Как какая-то новая философия, другой подход к базам данных, который я мог увидеть не только на бумаге в учебниках в главе "типы баз данных". Примерно как кататься на велосипеде под веселую музыку в толпе. Кто это делал, тот меня поймет. И нет, это не замена SQL, и нет, он не готов к продакшену, а пока активно растет. Можем сослать это на юношескую безбашенность и манию к чему-то новому. Быть может. Но пока мне это нравится :)

Анка — 26.07.2010 - 20:07 [95.79.115.230]
>чтобы даже моя жена поняла
Обижаешь, да? :D
Анка — 26.07.2010 - 20:19 [95.79.115.230]
>монго любит параллелиться
>Монго любит хранить часто используемые данные в памяти
>ни разу не наблюдал как какой-то запрос по непонятным причинам может выполняться десяток секунд

Как будто котенка в добрые руки отдаешь. "МОнго любит играть с тапочками, Монго любит кушать кашку, а еще я ни разу не видел, чтобы Монго какал мимо горшочка"
themylogin — 26.07.2010 - 20:21 [192.168.0.12]
Супер круто! Жалко, что у меня сплошные бизнес-проекты:(
werehuman — 26.07.2010 - 20:24 [178.49.21.200]
> Это называется JOIN

Это называется связывание. Однако, всем пох.

> CouchDB написан на Erlang'е. Это снижает мой интерес к ней до нуля.

Неосилятор?

> Cassandra слишком document-oriented. Отлично подходит только под узкий круг задач.

Ну давай, рассказывай, как это.

> MongoDB же написан на С++, что внушает мне доверие
> на C++
> доверие
> на C++
> доверие

Ну... пусть будет доверие, если перечитывать код раз по десять, то можно и доверять.

> Философия mongo диктует нам использовать вложенные массивы, когда мы бы использовали JOIN в SQL.

Можно ли использовать массив как указатель? Или если у меня две таблицысущности используют одно облако тегов, то у каждой сущности будет свои названия тегов?

> Размер всегда - ровно степень двойки.

Ужас. Хотя, может и не такой уж и ужас.

> Монго любит хранить часто используемые данные в памяти, чтоб не читать каждый раз.

Разве мускул с постгресом не умеют из коробки?

> А самые ленивые пользователи django, так привыкшие, что пол сайта генерируется за них самостоятельно, вообще начинают плеваться какашками, когда им говоришь, что на админку придется потратить больше, чем 0 строк кода. Я для таких даже название придумал: дитя фреймворков. Мне так жалко, когда человек теряется в гугле на пол дня со словами "а как я буду писать авторизацию, за меня всегда это джанга делала". Мой РНР-шный опыт все-таки иногда пригождается :)

Все начинали с малого, и приходили к большему. Не думай, что жабакодеры не умеют malloc в сишке.
werehuman — 26.07.2010 - 20:26 [178.49.21.200]
>>монго любит параллелиться

В смысле, если кассир кого-то уже обслуживает, то БД не отправляет поступившего только что покупателя в очередь, а садит еще одну блондинку за свободную кассу и зовет покупателя туда.
V@s3K — 26.07.2010 - 20:32 [178.49.15.6]
werehuman, вот он! Обиженный третьим минусом. Но не бойся, там было не про тебя.

> Неосилятор?
Вот если в СУБД обнаружится фатальный баг, кого проще найти С++-кодера или Ерланг?

> Можно ли использовать массив как указатель?
DBRef
ReDetection — 27.07.2010 - 20:26 [80.64.175.96]
ты уже переписал себе блог на монго? :)
V@s3K — 27.07.2010 - 21:06 [85.26.225.141]
ReDetection, да, уже тестируем. Много вкусного и нелюбимого вами :Р
ReDetection — 28.07.2010 - 20:56 [80.64.175.96]
V@s3K, а ты уверен, что я не люблю такие плюшки? :Ъ
lestat — 10.08.2010 - 17:33 [195.128.77.5] Linux
Доброго дня.

А не подскажите плизз как вы делали в Pylons авторизацию?

Сам только начал изучать Pylons (как раз-таки после джанги, которая ужас как надоела своей ограниченностью).

В доках и буке pylons указан authkit(который обновлялся 8 месяцев назад и в буке написали что страничку больше не будут обновлять) и repoze.who/repoze.what (по которому примеров взаимодействия с pylons толкового нету).

p.s.
в этом плане даже какой-нибудь werkzeug кажется более симпатичным из-за простоты и актуальной документации.

p.p.s. вот хочу тоже python+mongodb изучить, но вот на чем делать пока не точно выбрал.
пока остановился на pylons и застрял :)

Спасибо!

если нужно могу сказать джаббер/мыло где можно чуток пообщаться по этому поводу :)
V@s3K — 10.08.2010 - 18:35 [95.79.90.250] Windows
lestat, доброго.
Мидлвари авторизации типа AuthKit, repoze.who я не особо копал, поэтому не могу сказать какой лучше какой хуже.

Список есть тут в конце: http://wiki.pylonshq.com/display/pylonscookbook/A+Spec+for+Pylons+Auth+Packages

Как пользоваться можно почитать в cookbook: http://pylonsbook.com/en/1.1/authentication-and-authorization.html

Как я писал в конце статьи - я решил не пытаться связать существующие библиотеки с монго, просто взял и написал необходимый мне функционал руками. Благо это просто и я кучу раз это делал. Но, несомненно, намного менее гибко, чем существующие методы. Зато свое :)

Но по отзывам я бы выбрал AuthKit. Говорят, что самый гибкий.

Джаббер и другие контакты, если надо, написаны в шапке на главной.
lestat — 10.08.2010 - 19:09 [195.128.77.5] Linux
спасибо большое, буду копать.

блог у вас супер получился )
vladz — 08.09.2010 - 23:32 [172.18.40.157] Windows
А чем XPath хуже?
V@s3K — 08.09.2010 - 23:33 [178.49.15.6] Linux
vladz, хуже чего?
vladz — 11.09.2010 - 20:37 [193.19.103.19] Windows
баз типа mongo
Те же запросы по-сути, только более распространенная технология. JSON легко можно перевести в XML, а потом пройтись по нему XSL или XPath-выборками.
V@s3K — 12.09.2010 - 12:27 [178.49.15.6] Linux
vladz, да, легко. Но это если сайт изначально проектировался как построенный на XSL. Еще одно удобство.
jesus — 07.05.2011 - 04:09 [92.39.143.110] Linux
я наверное немного запаздываю, но есть всё-таки на просторах нашей родины хостинг с монго на борту, называется локум. там не только монго, а и mysql и постгре ну и до кучи гит, меркуриал, php и рельсы. может быть и ещё чтот есть - более не вглядывался.

добра
Aleks Revo — 13.11.2011 - 21:19 [178.216.127.205] Linux
> А теперь представим, что к новости нужны теги. Это еще одна таблица тегов. У новости может быть много тегов. Это еще одна таблица соотношений новость-тег. А к новости нужны комментарии. Еще таблица комментариев. Один запрос обрастает 10 JOIN'ами с другими таблицами.

Повеситься - выбирать новость с тегами и комментариями одним запросом! И судя по тону аффтар на этом не остановится.

Чувак, читай дальше ста страниц, бери не триальные версии книг!
V@s3K — 13.11.2011 - 21:40 [178.49.15.6] Mac OS
Aleks Revo, вот по чему, а по SQL я уже сам книги писать могу :D
Но вы правы, пример с новостями-комментариями не удачный, так никто не делает, ну придумайте посложнее. Он был приведен только за тем, чтобы показать как изменение парадигмы решает некоторые проблемы... и добавляет другие.

И да - у всего своя ниша, какой-нить ERP никто на нереляционных СУБД писать не будет. NoSQL не панацея, это понимаешь на собственной шкуре, а не в хвалебных статьях мудаков типа меня. А от global write lock в mongodb вообще хочется блевать кровью.
Aleks Revo — 13.11.2011 - 21:52 [178.216.127.205] Linux
Ладно, поумерю тон, но промолчать не смогу ))

> Философия mongo диктует нам использовать вложенные массивы, когда мы бы использовали JOIN в SQL. То есть список категорий надо делать не отдельной таблицей, а вставлять массивом в поле categories у каждой новости

Это что, в каждой статье хранится всё дерево категорий? Или как это понимать? Как происходит редактирование такого дерева категорий? Вот сеошники обнаружили, что одну категорию надо бы переименовать, ибо... и что, одним махом обновляются все статьи? Тысяча? Десять тысяч? Сто тысяч? Да и монго бралось не для таких детских размеров - оно ж под кластер заточено. А как в такой системе формируется меню с этим деревом категорий? Запросом ко всем N тысяч?

Не слишком ли высокие накладные расходы на ровном месте философии?

Беспричинная денормализация - такое же зло, как и беспричинная нормализация. А то следуя такой логике во избежание лишних джойнов мы должны в каждом комментарии, в каждой статье хранить полный профиль пользователя, их создавшего? Как-то это нездорово.

> + Когда число записей в разы превышает число чтений

Вот это и интересно - а с чем сравнивалось? Реляционные базы запись выполняют медленнее? У них принципиально другое железо или они пишут больше данных?

> + Огромные запросы на выборку разных наборов данных с их аналитикой

А с чего у нас начинается огромность?

SELECT id FROM tbl WHERE a > b - это огромный запрос?

> - Ну и последний и очевидный недостаток, который не относится монго, но важен, так это то, что с ним нет хостингов

Здесь как раз всё далеко не так плохо - давно уже хватает VPS по цене обычного виртуального хостинга.
Aleks Revo — 13.11.2011 - 22:01 [178.216.127.205] Linux
> Монго любит хранить часто используемые данные в памяти, чтоб не читать каждый раз

У монго свой механизм или она пользуется кэшем OS?
V@s3K — 13.11.2011 - 22:04 [178.49.15.6] Mac OS
Aleks Revo, все ваши вопросы понятны, я же говорю - у каждой технологии своя ниша. "Накладные расходы ради философии" вы слишком преувеличиваете, в NoSQL вы просто заменяете одни расходы другими, и кое-где это может помочь. Просто почитайте, попробуйте и вы поймете где сахар, а где гвозди. Беспричинно денормализовывать тут тоже не надо - везде есть предел.

Тесты-сравнения производительности я не делал, потому что любой такой тест будет синтетикой и ничего не покажет. Эта инфа взята с тестов на офсайте и тематических блогах, которые проводили. У них, конечно же, все в пользу NoSQL, кроме чтения. Чтение - на уровне. Вот отсюда и был такой вывод.

И нет, я не адепт NoSQL и MongoDB и даже не ставлю их выше реляционных БД, просто их философия отличается и именно это и интересно мне, как разработчику.
V@s3K — 13.11.2011 - 22:07 [178.49.15.6] Mac OS
> У монго свой механизм или она пользуется кэшем OS?
ЕМНИП свой, но я могу ошибаться, либо мои знания могли устареть с момента написания статьи (больше года назад). Ее кеш хранится в RAM и его управление устроено по дисциплине LRU, которая вроде вполне адекватно показывает себя в кеше процессоров. Вот что пишут на офсайте:

With relational databases, object caching is usually a separate facility (such as memcached), which makes sense as even a RAM page cache hit is a fairly expensive operation with a relational database (joins may be required, and the data must be transformed into an object representation). Further, memcached type solutions are more scaleable than a relational database.

Mongo eliminates the need (in some cases) for a separate object caching layer. Queries that result in file system RAM cache hits are very fast as the object's representation in the database is very close to its representation in application memory. Also, the MongoDB can scale to (almost) any level and provides an object cache and database integrated together, which is very helpful as there is no risk of retrieving stale data from the cache. In addition, the complex queries a full DBMS provides are also possible.


Ну и вот еще: http://www.mongodb.org/display/DOCS/Caching
Тут, кстати, описан один из самых моих нелюбимых аспектов монги - про память =/
Aleks Revo — 13.11.2011 - 22:10 [178.216.127.205] Linux
> если в СУБД обнаружится фатальный баг, кого проще найти С++-кодера или Ерланг?

Тут какое-то противоречие. Эрланг нужен для крутых проектов, где нон-стоп 24/7/365. Полагаю такие конторы не только найдут, но и держат про запас.

А конторы, которые это нафиг не впало, ибо уровень не тот, и базу сами колупать не будут, ибо не каждый C++ кодер это осилит, поскольку дело не в количестве, а в качестве - эрланг учат как раз для работы над критичными проектами.

И в конце концов: фатальный баг в СУБД - это дело, которым озаботится весь мир, а не отдельные конторы.

Всё вышесказанное - это о языке, как критерии, а не о конкретных СУБД на нём написанных )
V@s3K — 13.11.2011 - 22:15 [178.49.15.6] Mac OS
> фатальный баг в СУБД - это дело, которым озаботится весь мир, а не отдельные конторы.
Когда дело касается по-настоящему больших контор, они уже не будут ждать пока "весь мир" починит, а будут чинить сами. Яндекс, например, вносил свои фиксы в mongo именно поэтому. Да даже в ядро Linux, хотя казалось бы...
В Parallels есть целая группа разработчиков, которая в основном и занимается ядром Linux именно для нужд компании, и множество ее фиксов таки входят в главную ветку.

Ну и вы должны понимать, что я должен был упомянуть язык как критерий, потому что даже на моем опыте бывало, что он становился решающим. Очевидно, не для простых разработчиков, но все же.
Aleks Revo — 13.11.2011 - 22:33 [178.216.127.205] Linux
> Просто почитайте, попробуйте и вы поймете где сахар, а где гвозди. Беспричинно денормализовывать тут тоже не надо - везде есть предел.

Ну, именно такое впечатление получилось из статьи. Возможно не хватает жизненных примеров - как это выглядит на практике?

Я с недавних пор использую монго в одном проекте - прицениваюсь к базе. Перед этим был коуч, который на фоне монго выглядит весьма бледно. Тесты делал - под конкретные свои задачи, о преимуществе Mongo в производительности ничего не могу сказать, но сравнивал я с Postgres - в большинстве случаев postgres ухитряется быть быстрее, но возможно тут сказывается, что всё-таки с ним у меня опыта больше и монго можно было бы ещё "подкрутить".

До того уровня, когда задачи простые, принципиальной разницы нет и монго можно выбрать именно за "сахар" - бессхемная база проще в плане поддержки, обещана простая кластеризация. Распределённая файловая система интегрированная в базу - тоже очень приятна.

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

Поэтому, не всё так однозначно. В проектах, где есть уверенность, что проект никогда не перерастёт простые задачи - монго, в современном его состоянии вполне может занять нишу mysql и хитрое телодвижение Оракла, загрёбшего лакомый кусочек и вместе с тем слабое звено с рынка БД, здесь не удалось. Но вот когда вдруг окажется, что нужно больше, чем монго может дать, возможно придётся менять коней на переправе.
V@s3K — 13.11.2011 - 22:48 [178.49.15.6] Mac OS
Aleks Revo, все верно. И эта статья написана как раз на первом уровне, когда "ого, я узнал про NoSQL, я нихера не умею, но как тут все пиздато". Уже через год практики отношение ко всему изменилось. И когда на своем опыте узнал про отсутствие ограничения кеша памяти (от чего городил такой велосипед с виртуализацией, что аж стыдно), и про global write lock который вообще убивает всю идею при отсутствии кластеризации, да много про что узнаешь именно на переправе. Что уж там, когда я писал свой первый проект на ней - я ВНЕЗАПНО узнал, что в ней нет оператора OR. Вот это был баттхерт, благо в следующей версии (1.5 вроде) его так же внезапно добавили и до продакшена я успел исправить все.

Но я не жалею. Теперь могу вполне выбирать именно нужное. Все-таки опыт.
Aleks Revo — 13.11.2011 - 22:48 [178.216.127.205] Linux
> With relational databases, object caching is usually a separate facility (such as memcached), which makes sense as even a RAM page cache hit is a fairly expensive operation with a relational database (joins may be required, and the data must be transformed into an object representation). Further, memcached type solutions are more scaleable than a relational database.

Абзац манипулятивный. Реляционные базы (ладно, не буду за все) прекрасно умеют такие трюки, без них - потеря производительности в десятки раз. Но почему-то главные аргумент: "придут злые джойны и всё заберут!" - как знамя у NoSQL, хотя джойн - это лишь одно из условий выборки, которое тоже может вполне разместиться в кэше (а если джойн становится причиной просадки в производительности - почему бы не денормализовать?). На уровне, когда приложение (НЕ БАЗА!) использует memcached, приложение берёт уже обработанные данные, вообще не обращаясь к базе (строго говоря, memcached - это тоже база, частный случай NoSQL - со своими "ключ-значение", тегами и кластеризацией). Поэтому сравнение сложного приложения с распределением данных на две базы и приложения запросы которого вмещаются в кэш процессора - как-то... Я не думаю, что кто-то откажется кешировать в памяти сложные обработанные данные, вместо обработки их, пусть даже в кеше процессора.
Aleks Revo — 13.11.2011 - 22:53 [178.216.127.205] Linux
> Но я не жалею. Теперь могу вполне выбирать именно нужное. Все-таки опыт.

Вот с этим, да и всё сообщение с этим - абсолютно согласен. Всё нужно попробовать. Но "опыт - сын ошибок трудных", его где угодно приобретать, но не на проектах которые имеют дедлайн. Впрочем - это тоже опыт и такое бывало ))

А вообще, я смотрю у крупных контор достаточно распространена практика разные части проектов делать на разных технологиях. Видимо таким образом обкатывают новые технологии и получают опыт на некритичных участках.
Aleks Revo — 13.11.2011 - 23:18 [178.216.127.205] Linux
Почитал про кеширование в монго и используемую технологию - в принципе, как и написано - "зависит от реализации менеджера виртуальной памяти ОС", то бишь за кеширование отвечает на самом деле операционная система, так же как за кеширование кода и небольших объёмов данных - алгоритмы процессора. Полагаю это по-умолчанию справедливо для большинства баз.

Вот, немного, про кэширование в постгрес http://www.sai.msu.su/~megera/postgres/talks/what_is_postgresql.html#buffer_management
refresh

(не заполняйте это поле)

i