提问



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

最佳参考


简介



对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术。在谈论ORM时,大多数人都指的是实现对象关系映射技术的库,因此短语一个ORM。[7]


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库更加灵活,因为: [8] [9] [10]



  • 它符合您自然的编码方式(这是您的语言!)。

  • 它抽象了数据库系统,因此您可以随时更改它。

  • 该模型与应用程序的其余部分绑定较弱,因此您可以更改它或在其他任何地方使用它。

  • 它可以让您像数据继承一样使用OOP,而不会头疼。



但是ORM可能很痛苦:



  • 你必须学习它,而ORM库不是轻量级工具;

  • 您必须进行设置。同样的问题。

  • 对于通常的查询,性能是可以的,但是对于大项目,SQL master总是会用自己的SQL做得更好。

  • 它抽象了数据库。虽然如果你知道幕后发生的事情就好了,但对于那些可以编写非常贪婪的语句的新程序员来说,这是一个陷阱,就像for循环中的重击一样。



如何了解ORM?



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



  • Java:Hibernate。

  • PHP:Propel或Doctrine(我更喜欢最后一个)。

  • Python:Django ORM或SQLAlchemy(我最喜欢的ORM库)。

  • C#:NHibernate或Entity Framework



如果你想在Web编程中尝试一个ORM库,你最好使用整个框架堆栈,如:[11] [12] [13] [14] [15] [16]



  • Symfony(PHP,使用Propel或Doctrine)。

  • Django(Python,使用内部ORM)。



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

其它参考1



  任何人都可以给我一个简短的解释......



当然。


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



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

  • Relational 部分是一个关系数据库管理器系统(一个数据库),还有其他类型的数据库,但最流行的是关系型(你知道表,列,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 )


并将员工插入数据库。


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

其它参考2


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


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


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


企业应用架构数据映射器的模式[19]

其它参考3


Hibernate一书中的Java Persistence with Hibernate(第3版)的第一章概述了一般的ORM概念,并讨论了ORM的动机和设计。强烈推荐,即使你不使用Java。

其它参考4


Storm是使用python的人的一个很好的选择。[21]

其它参考5


这是一个很大的话题。拿起一本好的冬眠书,它应该在获得细节的hibernate材料之前详细解释ORM。


https://www.hibernate.org/[22]

其它参考6


像所有首字母缩略词一样,它是模棱两可的,但我认为它们意味着对象 - 关系映射器 - 一种掩盖你眼睛的方式,并且相信它下面没有SQL,而是它的所有对象;-)。不是真的,当然,并非没有问题 - 总是色彩鲜艳的杰夫阿特伍德将ORM描述为CS的越南;-)。但是,如果你知道很少或没有SQL,并且有一个非常简单/小规模的问题,他们可以节省你的时间! - )[23] [24]

其它参考7


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

其它参考8


DALMP http://code.google.com/p/dalmp/可能是一个很好的php/mysql目前支持许多缓存后端,如redis/memcache/apc [25]