javascript - DAO 与 ORM - 在 Sequelize.js 的上下文中解释的概念

标签 javascript orm sequelize.js dao

我最近一直在使用 Sequelize.js,并且经常遇到术语“DAO”。来自 ActiveRecord(在 Rails 中),ORM 的想法似乎非常简单。

谁能给我解释一下 DAO 是什么?它与 ORM 有何不同?它如何导致更多模块化代码/防止抽象泄漏?

编辑:阅读以下内容后:https://www.reddit.com/r/learnprogramming/comments/32a1fr/what_is_the_general_difference_between_dao_and_orm/

感觉/似乎 DAO 可以被认为是一个单一的“模型”——在 ActiveRecord 的上下文中,我的用户实例将被认为是一个 DAO,因为它:“抽象了实现远离应用程序的持久数据存储,并允许与其进行简单交互“?

最佳答案

这里有一些想法可能会帮助您理清思路。我对 ActiveRecord 比对 Sequelize 更熟悉,所以我会使用它,但两者的概念应该相同。

你有一个数据库。您可以完全独立于 Rails(例如,使用数据库管理工具),在该数据库上运行查询 - 类似于 "select * from users limit 1"。但这只会在某些管理窗口中为您提供一组结果,这对您的 Rails 应用程序用处不大。您希望能够从 Rails 应用程序执行 SQL,并以 Ruby/Rails 可以使用的形式取回数据。您需要通过某种 ruby 对象访问您的数据 - 您需要一个数据访问对象,或者DAO.

在 Rails 中,您可以使用类似以下内容运行上面的查询:

result = ActiveRecord::Base.connection.execute("select * from users limit 1")

result 变量不会知道或关心您的User 模型。它所包含的只是一个普通的 ruby​​ Hash 实例列表,例如:

{
  "id" => "1234",
  "email" => "fred@example.com",
  "first_name" => "Fred",
  "last_name" => "Flintstone",
}

如果您想将 first_name 更新为 Bob,您不能只编辑该散列并在其上调用保存 - 它只是一个普通的旧散列,只是数据,没有额外的智慧。所以你必须再次编写自己的 SQL,并让 Rails 为你执行它:

ActiveRecord::Base.connection.execute("update users set first_name = 'Bob' where id = 1234")

所以您在此上下文中使用的基本上只是 Rail 的 DAO,而没有使用它的 ORM

ORM 就像是 DAO 之上的一层。您可以拥有一个没有ORMDAO,但是您不能拥有一个没有DAOORMORMObject Relational Mapper 将使用 ObjectsMap Relational 数据库中的概念/记录 使用您的编程语言(即 Ruby)。所以,如果你想做上面的事情,使用 Rail 的 ORM 而不是使用它的 DAO,它可能看起来像:

user = User.find(1234)
user.name = 'Bob'
user.save!

看看使用 ORM 有多好?现在,上面的代码片段使用 ORM,本质上仍然只是执行我们之前详述的相同 SQL。 ORM 只是抽象出更多的细节并提供更智能的对象来为我们节省大量额外的工作。

同样,展示的概念可以转移到 Sequelize/Javascript 和其他语言/框架。

所以 DAO 只是“一个可以执行 SQL 并以编程语言原生的一些基本数据结构返回结果的对象”。 ORM 最终将使用 DAO 与数据库进行通信,但在顶部提供了更多内容。

关于javascript - DAO 与 ORM - 在 Sequelize.js 的上下文中解释的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41495110/

相关文章:

javascript - 如何翻译AngularJS中的依赖下拉菜单

javascript - 列表和模型同步

c# - 在 Fluent NHibernate 中,如何将自动映射类型与非自动映射类型结合起来?

node.js - Github 操作 - 未处理的拒绝 SequelizeConnectionError : no PostgreSQL user name specified in startup packet

mysql - Node.js Sequelize 虚拟列从其他模型中提取值(value)

mysql - 使用sequelize插入mysql中的两个依赖表

javascript - react + MongoDB 端口

javascript - 您将数据模型放在 dojo 应用程序的什么位置?

java - entityManager.persist(用户) -> javax.persistence.EntityExistsException : User@b3089 is already persistent

mysql - 查询 'across'数据透视表