database - 使用关系数据库/ORM 或文档数据库/ODM 的动机

标签 database orm nosql document-database odm

很久没有从头开始创建项目了,现在document-oriented databases (以及 ODM)已经变得相当流行,所以在盲目地走关系路线之前我必须考虑它们。

谁能尝试列出可能导致一种选择或另一种选择的动机/项目标准?

最佳答案

ORM/关系数据库/SQL

优点:

  • 易于理解的标准方法
  • 很好地映射到具有一致结构的数据
  • 很好地映射到具有多个实体之间的多种关系的数据
  • 具有广泛的加入能力
  • 有交易
  • 可扩展到每秒处理大量事务(使用 MySQL Cluster、Fusion-IO 等)

缺点:

  • 难以扩展到大量数据,如果性能也是一个问题的话
  • 不能很好地映射到具有可变结构(或半结构化)的数据
  • 持久对象需要胶水/翻译层,这可能是性能瓶颈(如果做错了也会非常冗长)

ODM/文档数据库/NoSQL

优点:

  • 可扩展到海量数据和大量相对独立的查询
  • 高可用性、分片、多主机、...
  • 很好地映射到半结构化数据
  • 很好地映射到具有更多可变结构的数据
  • 数据模型可以更灵活
  • 查询不必转换为 SQL( native NoSQL 查询样式可能更适合也可能不适合某些用途,并且没有 SQL 驱动程序/解析/等的开销)
  • (对于对象数据库)直接映射到对象,不需要对象关系转换

缺点:

  • 经常,不加入(或有限版本的加入)
  • 通常,没有事务(或事务一致性/原子性的有限版本)

如何决定

基于数据类型和使用模式:

  • 数据是否具有统一的结构? (关系)......或可变/不一致的结构? (文件)
  • 典型用法是否读取/写入单一类型的实体? (文档)......或由多个实体的属性组成的 View ? (关系)
  • 是否需要交易? (关系)......或者不需要交易? (文件)

基于扩展/性能要求:

  • 海量数据 + 少量、缓慢、复杂的读/写? (数据仓库类型场景)=>关系型
  • 海量数据 + 海量的简单读/写? (craigslist 后端类型场景)=> 文档
  • 海量数据 + 快速、复杂的读/写? => 这很难;要么使用关系并尝试扩大规模,要么使用文档并尝试简化查询
  • 中等数据 + 快速事务写入? (银行类型场景)=> 关系
  • 中等数据+中等读/写? => 根据供应商/工具支持、熟悉程度等选择任何一个

引用资料

(背景:我最近没有在这方面做任何事情,但几年前我构建了一个大型系统,它使用复制的 MySQL + Sphinx,即关系和文档混合)

关于database - 使用关系数据库/ORM 或文档数据库/ODM 的动机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528216/

相关文章:

ruby-on-rails - 使用 Rails/ActiveRecord 覆盖旧数据库中列的别名或别名

java - 使用 Hibernate 分区

python - Django Orm : Custom Select column with aggregate functions for grouped values

ruby-on-rails - NodeJS 和 ORM?

database - 模型 M :M relations in Cassandra? 有哪些替代方法

mysql - 使用 MySQL for Excel - 数据库中的一个特定表将无法导入,所有其他表都工作正常

php - 我需要帮助解决 mySQL 查询花费比预期更长的原因

sql - mysql select查询帮助--ORDER BY

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

sqlite - 有关UnQL(最新的CouchDB,Sqlite统一语言)的入门教程?