使用Django构建类似Top Coder的应用,选择Mongo DB还是Couch DB?

3 投票
3 回答
2625 浏览
提问于 2025-04-17 04:48

这是我现在的情况:

  1. 我在用Ubuntu 11.10。
  2. 我在用Django 1.3。
  3. 我在用Python 2.7。

我想做一个类似于top-coder的应用程序,我已经有了这个应用的基本框架。基本需求包括:

  1. 保存代码。
  2. 保存用户名和排名(用户资料)。
  3. 应该允许老师创建选择题(类似于Google文档)。

我对Django有一些基础知识,也做过几个(简单的)应用。与其做一个在线工具,我想知道能不能在Django上做一个类似于conf2py的东西,基于web2py。

我们把这个小项目叫做examPy(我知道,名字很普通),我想知道能不能做一个更像是Django插件的应用,还是说我对Django的理解完全错了?

我主要想问的是:

因为我想学习一个新的数据库,并且在Django中使用过Postgres,我应该选择CouchDB还是MongoDB来搭配Django?

回答可以是解释,或者是一些文档、博客的链接,告诉我它们的优缺点。

3 个回答

2

我之前在一个生产应用中用Django搭配CouchDB。CouchDB还不错,有一些很不错的想法,但我现在把这个应用转到MongoDB上。为什么呢?因为在Django社区里对MongoDB的支持更好。Django-nonrel有一个MongoDB的后端。通过使用Django-toolbox,我可以在模型中嵌套模型,还能有一些基本的管理支持。

如果我没记错的话,Django-nonrel最终会合并进Django的核心部分。在未来五年里,我认为Django对MongoDB的支持会比对CouchDB的支持要多。当然,这种情况可能会改变,但我觉得MongoDB更适合我。

3

我之前在Django中使用过mongo-engine,但你需要专门创建一个文件来存放Mongo文档,比如叫做Mongo_models.py。在这个文件里,你定义你的Mongo文档。然后你需要创建表单来对应每个Mongo文档。每个表单都有一个保存方法,用来插入或更新存储在Mongo里的数据。Django的表单设计得很灵活,可以适配任何数据后端(只要稍微动点脑筋)。

如果你选择这个方式,就可以避免使用Django的非关系型数据库功能,而这个功能在Django 1.4中仍然没有加入。此外,我听说django-nonrel现在也暂时停止更新了。

我对CouchDB和Mongo都用得很熟。CouchDB的界面很不错。我的同事正在为Mongo做类似的东西。Mongo的map和reduce功能比CouchDB快得多。Mongo在加载和获取数据时反应更快。Mongo的Python库也更容易上手(pymongo和mongo-engine都很棒)。

一定要阅读Mongo的生产环境建议!不要在同一个节点上运行Django和Mongo实例,否则在流量高峰时你会遭遇严重的性能问题。Mongo和Memcache/Redis搭配使用效果很好,可以存储减少后的数据以便快速查找。

注意:如果你的数据结构非常明确且有条理,可以用文档或模型来描述,那就不要用Mongo。Mongo并不是为这种情况设计的,像PostGreSQL这样的数据库会更合适。

  • 我用PostGreSQL来处理关系型或结构化良好的数据,因为它在这方面表现很好。占用内存小,响应速度快。
  • 我用Redis来缓存或处理内存中的队列/列表,因为它在这方面非常出色。只要你的内存足够,性能非常好。
  • 我用Mongo来存储大型JSON文档,并在需要时对它们进行Map和reduce,因为它在这方面表现很好。如果可以的话,确保对某些列使用索引,以加快查找速度。

不要用圆形去填方形的洞,它是填不满的。

3

一般区别

Django特定内容

经过我的研究,我发现MongoDB和CouchDB之间的相似性很大,所以你选择哪个可能更多是个人的喜好,而不仅仅是使用场景。就我个人而言,我对CouchDB有点迷恋,正在寻找使用它的理由。

影响你决定的关键因素可能是哪个noSQL解决方案为Django提供了最成熟的ORM框架?

撰写回答