【问题标题】:What is an ORM, how does it work, and how should I use one? [closed]什么是 ORM,它是如何工作的,我应该如何使用它? [关闭]
【发布时间】:2010-11-19 18:13:54
【问题描述】:

有人建议我将 ORM 用于我正在设计的项目,但我无法找到有关它是什么或它如何工作的信息。

谁能简要解释一下什么是 ORM,它是如何工作的,以及我应该如何开始使用它?

【问题讨论】:

  • 我发现了这个问题,但它是从 2009 年开始的,我不知道你是否已经掌握了 ORM,但在 CodePlex C#(entityframework.codeplex.com) 中寻找实体框架这是你可以从中学习的源代码.你也可以阅读这个。 (dbtechnet.org/labs/dae_lab/Orm.pdf)
  • 只想指出ORM cam也与Object-Role Modeling en.wikipedia.org/wiki/Object-role_modeling有关
  • 这是一个有用的问题,最高答案的投票似乎证实了这一点。什么是 ORM 的简要描述不需要意见。仅仅因为用户要求链接以开始该问题就被标记为离题。我觉得这是版主频繁的过度反应。
  • @NeilG 一个封闭的问题意味着这个问题是题外话。答案中可能有有用的信息,但这并不能使问题成为主题。此外,它不会被删除,它会保留在这里,但我们仍然需要保持 SO 的清洁和主题,以便它发挥最佳功能。所以,回答你的第一条评论:这不是一个有用的问题,有有用的答案。
  • @NeilG 问题是问题包括对资源的请求(在标题和问题中)。这样的请求是题外话,主要是因为它导致人们只是发布他们最喜欢的资源的链接,就像这里的几个答案一样。从问题中删除对资源的请求将使某些现有答案无效。作为普通用户,我们不允许编辑问题以使答案无效。因此,它应该被关闭。如果问题没有得到解答,则可以对其进行编辑以删除这些请求并保持打开状态。

标签: database orm language-agnostic


【解决方案1】:

简介

Object-Relational Mapping (ORM) 是一种允许您使用面向对象范例从数据库中查询和操作数据的技术。在谈论 ORM 时,大多数人指的是实现对象关系映射技术的,因此称为“ORM”。

ORM 库是用您选择的语言编写的完全普通的库,它封装了操作数据所需的代码,因此您不再使用 SQL;您可以使用与您使用的语言相同的语言直接与对象交互。

例如,这是一个完全虚构的伪语言案例:

你有一个书类,你想检索作者是“Linus”的所有书。手动,你会做这样的事情:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

使用 ORM 库,它看起来像这样:

book_list = BookTable.query(author="Linus");

机械部分通过 ORM 库自动处理。

优点和缺点

使用 ORM 可以节省大量时间,因为:

  • DRY:您只在一个地方编写数据模型,更容易更新、维护和重用代码。
  • 很多事情都是自动完成的,从数据库处理到I18N
  • 它迫使您编写MVC 代码,最终使您的代码更简洁。
  • 您不必编写格式不正确的 SQL(大多数 Web 程序员真的很讨厌它,因为 SQL 被视为一种“子”语言,而实际上它是一种非常强大和复杂的语言)。
  • 消毒;使用准备好的语句或事务就像调用方法一样简单。

使用 ORM 库更灵活,因为:

  • 它符合您自然的编码方式(这是您的语言!)。
  • 它抽象了数据库系统,因此您可以随时更改它。
  • 该模型与应用程序的其余部分弱绑定,因此您可以更改它或在其他任何地方使用它。
  • 它让您可以轻松使用像数据继承这样的 OOP 优点。

但 ORM 可能会很痛苦:

  • 你必须学习它,ORM 库不是轻量级工具;
  • 您必须进行设置。同样的问题。
  • 对于普通查询,性能还可以,但对于大型项目,SQL 大师总是会使用自己的 SQL 做得更好。
  • 它对数据库进行抽象。虽然知道幕后发生的事情没关系,但对于可以编写非常贪婪的语句的新程序员来说,这是一个陷阱,就像for 循环中的重击一样。

如何了解ORM?

好吧,用一个。无论您选择哪个 ORM 库,它们都使用相同的原则。这里有很多 ORM 库:

如果您想在 Web 编程中尝试 ORM 库,最好使用整个框架堆栈,例如:

  • Symfony(PHP,使用 Propel 或 Doctrine)。
  • Django(Python,使用内部 ORM)。

除非你想学习一些东西,否则不要尝试编写自己的 ORM。这是一个巨大的工作,旧的需要花费大量的时间和工作才能变得可靠。

【讨论】:

    【解决方案2】:

    对象模型关注以下三个概念 数据抽象 封装 遗产 关系模型使用关系或表的基本概念。 对象关系映射(OR 映射)产品将对象编程语言功能与关系数据库集成在一起。

    【讨论】:

      【解决方案3】:

      谁能给我一个简单的解释...

      当然。

      ORM 代表“对象到关系映射”,其中

      • Object 部分是您在编程语言(本例中为 python)中使用的部分

      • 关系部分是关系数据库管理系统(即数据库)还有其他类型的数据库,但最流行的是关系(您知道表、列、pk fk 等)例如 Oracle MySQL、MS-SQL )

      • 最后,映射部分是您在对象和表格之间建立桥梁的地方。

      在您不使用 ORM 框架的应用程序中,您可以手动执行此操作。使用 ORM 框架可以让您减少创建解决方案所需的样板文件。

      假设你有这个对象。

       class Employee:
            def __init__( self, name ): 
                self.__name = name
      
             def getName( self ):
                 return self.__name
      
             #etc.
      

      还有桌子

         create table employee(
                name varcar(10),
                -- etc  
          )
      

      使用 ORM 框架可以让您自动将该对象映射到数据库记录,并编写如下内容:

         emp = Employee("Ryan")
      
         orm.save( emp )
      

      并将员工插入数据库。

      哎呀,这不是那么简短,但我希望它足够简单,可以捕捉到您阅读的其他文章。

      【讨论】:

        【解决方案4】:

        像所有首字母缩写词一样,它是模棱两可的,但我认为它们的意思是object-relational mapper——一种遮住眼睛并让人相信下面没有 SQL 的方法,而是所有对象;-)。当然,这不是真的,也不是没有问题——总是丰富多彩的 Jeff Atwood 将 ORM 描述为the Vietnam of CS;-)。但是,如果您对 SQL 了解很少或根本不了解,并且遇到了一个非常简单/小规模的问题,那么它们可以为您节省时间!-)

        【讨论】:

          【解决方案5】:

          ORM(对象关系映射器)是一种软件/层,可帮助将代码对象映射到数据库。

          有些处理的方面比其他的多……但目的是减轻开发人员肩上数据层的一些负担。

          这是 Martin Fowler(数据映射器)的简短剪辑:

          Patterns of Enterprise Application Architecture Data Mappers

          【讨论】:

            猜你喜欢
            • 2020-07-18
            • 2013-03-23
            • 2012-07-23
            • 1970-01-01
            • 2022-06-17
            • 2021-10-22
            相关资源
            最近更新 更多