Как работать с базой в приложениях на Tornado?
================================================

 Есть задача реализовать реал-тайм приложение, начал копать в этим направлении, много узнал, но один вопрос остается открытым, как работать с данными? На примере Tornado-приложения?  
  

Наткнулся на ответы нескольких категорий:  

1) Использовать MongoDB (motor)  

2) Использовать разные обертки на стандартный библиотеки аля psycopg2, которые позволяют выполнять асинхронные запросы.  

3) Не использовать асинхронность, а делать маленькие-быстрые запросы.  
  

Что лучше?  

К примеру, с чатом, в принципе подойдет 3 пункт, так как сложных запросов там не предвидеться, но если нужно что-то по-серьезнее, JOIN или большую выборку, как быть? 

 Кажется, в Вашем вопросе скрыто сразу несколько. Попробую их вычленить и дать ответ.  
  

1. Стоит ли писать полностью асинхронное приложение? Или стараться сделать синхронно работающее, но быстрое? Ответ зависит от специфики приложения.  
  

Важно понимать, что во многих случаях за счет асинхронности вы не ускоряете ответ приложения на внешний запрос: если для ответа на запрос приложению надо сделать запрос в mongodb и на основе полученных данных - запрос в mysql, то вы все равно не ответите наружу раньше, чем выполните эти два запроса. По сути, в этом случае вы экономите только память (и немножко - процессор), потому что вместо 40 параллельно запущенных процессов, отвечающих на запросы, можете запустить, скажем, 4 (по числу ядер).  
  

Однако, если надо сделать несколько независимых запросов к разным источникам - то тут уже будет явное ускорение за счет одновременной работы запросов. В полной мере это проявится, если запросы идут к внешним сервисам, размещенным на других машинах. Особенно если это медленные с точки зрения сети внешние сервисы (например, api сторонних сервисов, работающие по http).  
  

На мой взгляд, сочетать асинхронный и синхронный подходы в рамках одного процесса рискованно и неудобно, правильнее и удобнее или писать синхронный код, или везде применять честную асинхронность (этим мне нравится [nodejs](http://nodejs.org/)). Разумеется, при этом ваш проект может состоять как из асинхронно работающих процессов, так и из синхронно выполняемых скриптов. Таким образом, я рекомендую посмотреть на специфику проекта в целом и "порезать" его на логические части, для которых проще применить синхронный подход и те, для которых асинхронный подход оправдан.  
  

2. Какую СУБД использовать? Много про это написано, но опять же - исходя из задач. В последние годы NoSQL-базы очень хорошо развились и предлагают интересные возможности. Например, если писать чат с прибамбасами, то может пригодиться механизм publish-subscribe (есть [в явном виде в redis](http://redis.io/topics/pubsub), также [реализуется на mongo](http://blog.mongodb.org/post/29495793738/pub-sub-with-mongodb) и других). Если масштаб проекта большой и нужно масштабирование и надежность, то стоит посмотреть на [riak](http://basho.com/riak/) и [aerospike](http://www.aerospike.com/) (они хорошо скейлятся в многосерверные конфигурации). И т.д. и т.п. - если надо, напишите подробнее о проекте, подумаем.  
  

3. Как работать с данной СУБД конкретно из python? Я не большой специалист именно по python, но насколько понимаю, есть библиотеки для асинхронной работы как с SQL-СУБД (по крайней мере, [для Postgres](https://github.com/FSX/momoko)), так и с NoSQL (по крайней мере, есть [для Mongo](http://motor.readthedocs.org/en/stable/) и [для redis](https://github.com/leporo/tornado-redis)).