【发布时间】:2012-01-11 01:13:30
【问题描述】:
一段时间以来,我一直在尝试将我在过去几年中读到的关于 noSQL(couchDB、mongoDB、Redis...)的一些“酷”的东西付诸实践。
我很习惯用 Django 编写应用程序,并开始使用 Play!当 Java 是唯一可接受的部署选项时(并且也很享受它)。两者都有模块可以工作,例如MongoDB,django 也有nonrel。但我从不觉得需要 noSQL。
直到我最终发现我认为是面向文档存储的一个很好的用例,例如 MongoDB。
用例
假设我们必须管理一些复杂项目的订购和跟进(无论如何)。这些项目可能有很多不同的属性,例如。过度简化我们可以有:
- 可以有冰箱
- 一两扇门,
- 属于 A、B 或 C 类,
- 表面颜色
- 独立或内置
- 烤箱可以有:
- 燃气或电力或两者兼有
- 自清洁与否
- 独立或内置
SQL/ORM 解决方案
如您所见,每个对象都可以有多个可以受类型约束的属性。
在我通常通过 ORM 的 RDBMS 中,我会定义一个“产品”模型,然后继承两个模型,一个冰箱和一个烤箱。 如果一段时间后冰箱获得了更多属性,我会修改模型 - 以及相应的架构 -、运行迁移并添加一列。
noSQL 解决方案
我能想到的noSQL解决方案有:
- 使用 RDF(使用 Virtuoso 之类的东西或构建我自己的简化三元组存储)
- 使用面向文档的数据库,例如 MongoDB
问题
但是我无法理解实际切换到仍然使用框架 ORM 和正确适配器(尤其是 DODB)的 noSQL 解决方案会有多么不同(更容易)的开发.
假设我通过 mongodb-engine 将 Django 与 MongoDB 一起使用。
我仍然使用相同的 ORM,所以我仍然将这些对象描述为模型,列出所有属性。 因此,ORM 正在做同样的工作! 如果使用 ORM(尤其是像 South 之类的东西)模型发生更改,则生成迁移的成本非常有限,不需要自己学习新技术。
DODB 可能有 /other/ 优点,而某些特定于 MongoDB(可扩展性、数据处理、可能是性能),但是......我所描述的确切用例和问题呢?
我很可能错过了一点,所以真正的问题来了:
对于这个特定的用例:
- 这个例子对 DODB 来说是好还是坏(你有好的例子吗)?
- 将 ORM 用于基本内容(用户、订单)和使用 noSQL没有复杂对象的 ORM 是否有意义,是否有完全切换到 noSQL 的令人信服的理由,或者我应该继续使用现有的 ORM/SQL?
我知道回答这些问题可能是部分主观的,因此您可以假设您完全了解 noSQL 和 SQL 理论,以及常用的 ORM;存在从库存 ORM 到 noSQL DB 的良好桥梁。假设我们正在讨论这个用 MongoDB 作为 noSQL 替代方案的用例。
但还有一个更普遍的问题——这是这篇 SO 帖子的核心问题:
- 难道不是一个好的 ORM(例如 JPA、ActiveRecord 或 Django 的 ORM)使得 noSQL 尤其是面向文档的数据库几乎没有用处吗?
- ...是否值得将 noSQL 与“经典”ORM 一起使用?
(从编程和维护的角度来看,“很少使用”,性能和类似标准是另一回事,需要精确的产品与产品比较)
[编辑]
我还想了解的是,在切换到 noSQL 时是否最好放弃使用 ORM。拥有更多“动态”模型会很好,例如。我可以有一个表格来描述冰箱和烤箱 模型 是什么(字段),代码中的冰箱和烤箱模型将能够动态构建它们的视图(用于编辑的表单和用于显示的列表) .
相关问题:
[编辑]:这些是为了展示我的研究,但也为了澄清我所问的不是关于 noSQL 与 SQL 的通用问题
- Is an ORM redundant with a NoSQL API?:类似!但我试图了解为什么大多数框架(见上文)通过其 ORM 提供 noSQL 访问。这是个好主意吗?
- why the use of an ORM with NoSql (like MongoDB) :比上一个更具体,但仍然是相反的。我认为 ORM 使 noSQL 无用,而不是相反!
- When to replace RDBMS/ORM with NoSQL
- When to use MongoDB or other document oriented database systems?
- https://softwareengineering.stackexchange.com/questions/54373/when-would-someone-use-mongodb-or-similar-over-traditional-rdms
编辑 和链接:
【问题讨论】:
-
slacy.com/blog/2011/01/… 这似乎朝着我正在考虑的方向发展。不要使用带有 nosql 的“经典”orms = 使用自定义 orms 或不使用 nosql :)
-
将此标记为移至程序员
-
我发现了一个有趣的项目:Siena
标签: django model-view-controller orm nosql playframework