blessmasterЯ не понял смысла этой фразы. Вы подтверждаете мое высказывание, но почему то делаете это в опровергающем стиле.
Какбэ необходимость требует по зависимости возможность.
blessmasterНикакого. Нельзя использовать методы (и их наличие или отсутствие) работы с реляционными БД (объединение таблиц в запросе) для оценки качества объектных.
Какое отношение это имеет к реляционности как качеству БД?
blessmasterДля реляционных СУБД, на примере MS SQL Server.
Каким образом? Что технически ускоряет? Я пока вижу только один фактор - данные одного типа более разрежены, что при чтении требует обращение к большему числу дисковых страниц (вероятность найти соседние записи на одной дисковой странице - ниже).
Использование в запросе кластерного индекса, размещенного физически рядом с данными, используемыми в этом же запросе позволяет считать индекс и данные одним махом.
Аналогом сложного объекта в реляционных БД является несколько таблиц. И чем больше таблиц в запросе, тем больше дисковых страниц нужно считать и тем больше будет обращений к дисковой подсистеме. Для СУБД, не работающих в режиме readonly, это оборачивается необходимостью работать дискам в самом медленном режиме - случайного доступа к данным.
Вернемся к ОБД.
Т.к. дисковая подсистема пишет данные постранично (страница при этом достаточно большая - 4кБ по-умолчанию для большинства аппаратных решений), данные объектной БД в одной коллекции будут записаны на диск “рядышком”, в пределах одной страницы.
Для нескольких коллекций вероятность этого существенно меньше. Например, авторы и их сообщения прирастают разными темпами.
blessmasterКак я писал выше, это
О рекомендуемых случаях применения, я бы не против узнать. В данном топике рассматривается один из случаев, когда рекомендуется попробовать.
- скорость разработки/поддержки при достаточном уровне производительности,
- реализация функционала, недоступного для встроенного языка запросов.
Для п.2. есть разумная граница применения. Это не должен быть костыль, который закрывает недоработки/недостатки архитектуры/структуры.
blessmasterУточню только по поводу отличия ХП.
JavaScript, если я верно понял то, что прочитал о Монго, - блокирующая часть для всей базы, в отличие от хранимых процедур и вероятно, от реализаций map/reduce в других базах, поправьте, если ошибаюсь.
Сложная бизнес-логика в одной транзации (а не только в одной ХП) может блокировать множество таблиц на время этой самой транзакции.
Таким образом, отличие сводится только к способу уменьшения времени блокировки. В Монго - горизонтальное аппаратное масштабирование.
Для небольших БД скорость map/reduce не будет иметь существенного влияния.
Для больших БД возникает необходимость создавать шарды, что автоматически будет обозначать распараллеливание map/reduce.
И наоборот, если есть критичный и часто используемый код map/reduce, то для ускорения используется аппаратный способ (кстати, достаточно дешевый) увеличения производительности - шардинг.
blessmasterЯ вполне допускаю, что описанная автором ситуация могла возникнуть вследствие внезапно изменившихся требований.
Как, говорится, “знал бы где упадёшь, - соломки б подстелил”.
Тогда изменить структуру БД (объединить коллекции) будет не только допустимым, но и оправданным, разумным решением.
Единожды проведенный рефакторинг для изменения запросов наверняка повлечет за собой меньше проблем в будущем по сравнению с постепенным замедлением map/reduce.
И то, если мое предположение о возможности использования map/reduce для объединения запросов 2-х коллекций вообще будет работать.