我最近一直在使用 Sequelize.js,并且经常遇到术语“DAO”。来自 ActiveRecord(在 Rails 中),ORM 的想法似乎非常简单。
谁能给我解释一下 DAO 是什么?它与 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
之上的一层。您可以拥有一个没有ORM
的DAO
,但是您不能拥有一个没有DAO
的ORM
。 ORM
或 Object Relational Mapper
将使用 Objects
使用您的编程语言(即 Ruby)。所以,如果你想做上面的事情,使用 Rail 的 Map
Relational
数据库中的概念/记录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/