什么是ORM,它如何工作,应该如何使用?[关闭]


230

有人建议我将ORM用于我正在设计的项目,但是我在查找有关其内容或工作方式方面遇到困难。

谁能给我关于ORM是什么以及它如何工作以及我应该如何开始使用它的简短解释?


8
我找到了这个问题,但这是2009年的问题,我不知道您是否已经掌握ORM,而是在CodePlex C#(Entityframework.codeplex.com)中寻找Entity Framework。这是您可以从中学习的源代码。您也可以阅读。(dbtechnet.org/labs/dae_lab/Orm.pdf
鲆Decimus

1
只是要指出,ORM cam也与对象角色建模有关 。en.wikipedia.org/wiki
O-9

1
这是一个有用的问题,最佳答案的投票似乎证实了这一点。简要描述什么是ORM不需要意见。仅仅因为用户要求一个链接来开始使用,问题就被标记为脱题。我觉得这是主持人经常做出的过度反应。
NeilG

3
@NeilG一个封闭的问题意味着该问题是题外话。答案中可能会有有用的信息,但这并不能使问题成为话题。此外,它不会被删除,它将保留在此处,但是我们仍然需要保持SO的清洁和最新,以便使其发挥最佳性能。因此,回答您的第一个评论:这不是一个有用的问题,有一些有用的答案。
M–

1
@NeilG问题是问题包括对资源的请求(标​​题和问题中都包括)。这样的请求是不合时宜的,主要是因为它导致人们只是在发布指向自己喜欢的资源的链接,就像这里的几个答案中所发生的那样。从问题中删除对资源的请求将使某些现有答案无效。作为普通用户,我们不允许编辑问题以使答案无效。因此,应将其关闭。如果问题没有得到解答,则可以对其进行编辑以删除这些请求并保持打开状态。
Makyen

Answers:


483

介绍

对象关系映射(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。这是一项巨大的工作,而旧的要花很多时间和工作才能变得可靠。


50

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

当然。

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

  • 对象的部分是你与你的编程语言使用一个(在这种情况下蟒蛇)

  • 关系部分是一个关系数据库管理系统(即数据库)有其他类型的数据库,但最流行的是关系(你知道的表,列,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框架将使您能够自动地用db记录映射该对象,并编写如下内容:

   emp = Employee("Ryan")

   orm.save( emp )

并将员工插入数据库。

糟糕,并不是那么简短,但是我希望它足够简单,可以吸引您阅读的其他文章。



4

像所有首字母缩略词一样,它也是模棱两可的,但是我认为它们的意思是对象关系映射器 -一种遮住您的眼睛并让您相信下面没有SQL的方法,而是所有对象;-)。当然,这不是真的,并非没有问题-总是充满色彩的Jeff Atwood将ORM描述为CS的越南 ;-)。但是,如果您几乎不懂SQL,或者有一个非常简单的小规模问题,它们可以为您节省时间!-)


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.