DAO vs ORM - 概念在Sequelize.js的背景下解释

The*_*ski 6 javascript orm dao sequelize.js

我最近一直在和Sequelize.js合作,经常遇到"DAO"这个词.来自使用ActiveRecord(在Rails中),ORM的想法似乎非常简单.

有人可以向我解释(最好是使用Javascript和Sequelize的一些上下文)DAO是什么?它与ORM有何不同?它如何导致更多模块化代码/防止抽象泄漏?

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

感觉/似乎DAO可以被认为是一个单一的"模型" - 就像在ActiveRecord的上下文中一样,我的用户实例将被视为DAO,因为它:" 从应用程序中抽象出持久数据存储的实现并允许与它进行简单的交互 "?

jos*_*ing 17

以下是一些可能有助于为您澄清的想法.我对ActiveRecord比Sequelize更熟悉,所以我会用它来运行,但两者的概念应该相同.

你有一个数据库.您可以完全独立于Rails(例如,使用数据库管理工具),在该数据库上运行查询 - 类似于"select * from users limit 1".但是这只会在某个管理窗口中为您提供一组结果,这对您的Rails应用程序没什么用处.您希望能够从Rails应用程序执行SQL,并以Ruby/Rails可以使用的形式获取数据.你需要AccessData通过某种红宝石的Object-你需要一个Data Access ObjectDAO.

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

result = ActiveRecord::Base.connection.execute("select * from users limit 1")
Run Code Online (Sandbox Code Playgroud)

result变量不会知道或关心你的User模型.它将包含的所有内容基本上都是普通的ruby Hash实例列表,例如:

{
  "id" => "1234",
  "email" => "fred@example.com",
  "first_name" => "Fred",
  "last_name" => "Flintstone",
}
Run Code Online (Sandbox Code Playgroud)

如果你想更新first_nameto Bob,你不能只编辑那个哈希并调用它上面的保存 - 它只是一个普通的哈希,只是数据,没有额外的智能.所以你必须再次编写自己的SQL,并让Rails为你执行它:

ActiveRecord::Base.connection.execute("update users set first_name = 'Bob' where id = 1234")
Run Code Online (Sandbox Code Playgroud)

所以你在这种情况下使用的基本上只是铁路DAO,而不使用它ORM.

它就ORM像是一个层顶DAO.你可以有一个DAO没有ORM,但你不能有一个ORM没有DAO.的ORM,或Object Relational MapperMap概念/在你的记录Relational数据库Objects的编程语言(即红宝石).所以,如果你想做上面的东西,使用Rail ORM而不是使用它DAO,它可能看起来像:

user = User.find(1234)
user.name = 'Bob'
user.save!
Run Code Online (Sandbox Code Playgroud)

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

同样,所演示的概念可转移到Sequelize/Javascript和其他langs/frameworks.

所以a DAO只是"一个可以执行SQL并在一些编程语言原生的基本数据结构中返回结果的对象".一个ORM最终将使用DAO与数据库进行沟通,但提供了很多更多之上.