什么是ORM?我在哪里可以了解更多信息?

Rya*_*yan 230 database language-agnostic orm

有人建议我为我正在设计的项目使用ORM,但是我无法找到有关它是什么或它是如何工作的信息.任何人都可以给我一个简短的解释或链接,我可以在哪里了解更多信息吗?

e-s*_*tis 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);
}
Run Code Online (Sandbox Code Playgroud)

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

book_list = BookTable.query(author="Linus");
Run Code Online (Sandbox Code Playgroud)

机械部件通过ORM库自动处理.

优点和缺点

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

  • :您只在一个地方编写数据模型,更容易更新,维护和重用代码.
  • 从数据库处理到I18N,很多东西都是自动完成的.
  • 它迫使你编写MVC代码,最终使代码更清晰.
  • 你不必编写构造不良的SQL(大多数Web程序员都非常厌恶它,因为SQL被视为"子"语言,而实际上它是一个非常强大和复杂的语言).
  • 消毒; 使用预准备语句或事务就像调用方法一样简单.

使用ORM库更灵活,因为:

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

但ORM可能很痛苦:

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

如何了解ORM?

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

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

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

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

  • 正如他们在维基百科中所说 - 这篇文章缺乏参考.你能否将产品名称升级为实际链接? (2认同)
  • @AgentZebra您是否已阅读答案中的“利弊”部分? (2认同)

Osc*_*Ryz 50

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

当然.

ORM代表"对象到关系映射"在哪里

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

  • 关系部分是一个关系数据库管理系统(即数据库)有其他类型的数据库,但最流行的是关系(你知道的表,列,PK FK等如Oracle的MySQL,MS-SQL)

  • 最后,Mapping部分是您在对象和表之间建立桥梁的地方.

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

所以,假设你有这个对象.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.
Run Code Online (Sandbox Code Playgroud)

和桌子

   create table employee(
          name varcar(10),
          -- etc  
    )
Run Code Online (Sandbox Code Playgroud)

使用ORM框架将允许您自动将该对象与db记录映射,并编写如下内容:

   emp = Employee("Ryan")

   orm.save( emp )
Run Code Online (Sandbox Code Playgroud)

并将员工插入数据库.

哎呀不是那么简短,但我希望它能够很容易地抓住你读过的其他文章.


Jus*_*ner 17

ORM(对象关系映射器)是一个软件的一部分/层,可帮助将代码对象映射到数据库.

有些人处理的方面比其他方面更多...但目的是从开发人员的肩膀中获取数据层的一些重量.

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

企业应用程序架构数据映射器的模式