关于数据库:什么是ORM,我在哪里可以了解更多信息?

What is an ORM and where can I learn more about it?

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


介绍

对象关系映射(ORM)是一种使用面向对象范式从数据库查询和操作数据的技术。在谈到ORM时,大多数人指的是实现对象关系映射技术的库,因此就有了"ORM"这个短语。

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

例如,这里有一个完全虚构的案例,其中包含伪语言:

你有一个读书班,你想取回所有的书,作者是"林纳斯"。手动执行如下操作:

1
2
3
4
5
6
7
8
9
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库时,它将如下所示:

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

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

利弊

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

  • Dry:只在一个地方编写数据模型,更新、维护和重用代码更容易。
  • 很多事情都是自动完成的,从数据库处理到i18n。
  • 它强制您编写MVC代码,这最终会使您的代码更干净一些。
  • 您不必编写格式不好的SQL(大多数Web程序员都很讨厌它,因为SQL被视为一种"子"语言,而实际上它是一种非常强大和复杂的语言)。
  • 清理;使用准备好的语句或事务与调用方法一样简单。

使用ORM库更为灵活,因为:

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

但ORM可能是一种痛苦:

  • 你必须学习它,而ORM库不是轻量级的工具;
  • 你必须设置它。同样的问题。
  • 对于通常的查询,性能是可以的,但是对于大型项目,SQL主控器总是可以更好地使用自己的SQL。
  • 它抽象了数据库。如果你知道场景背后发生了什么,这没关系,但对于新的程序员来说,这是一个陷阱,他们可以编写非常贪婪的语句,就像在for循环中遭受重创一样。

如何学习ORM?

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

  • Java:Hibernate。
  • 推进或学说(我更喜欢最后一个)。
  • python:django-orm或sqlacalchemy(我最喜欢的ORM库)。
  • C:NHibernate或实体框架

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

  • symfony(php,使用推进或学说)。
  • Django(python,使用内部ORM)。

不要试图写自己的ORM,除非你想学点东西。这是一项巨大的工作,而旧的工作在变得可靠之前花费了大量的时间和精力。


Can anyone give me a brief explanation...

当然。

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

  • 对象部分是与编程语言(在本例中是Python)一起使用的部分。

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

  • 最后,映射部分是在对象和表之间架起桥梁的地方。

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

假设你有这个物体。

1
2
3
4
5
6
7
8
 class Employee:
      def __init__( self, name ):
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

桌子

1
2
3
4
   create table employee(
          name varcar(10),
          -- etc  
    )

使用ORM框架可以自动将该对象映射为DB记录,并编写如下内容:

1
2
3
   emp = Employee("Ryan")

   orm.save( emp )

并将员工插入数据库。

很抱歉,没有那么简单,但我希望它足够简单,可以抓住你读过的其他文章。


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

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

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

企业应用程序体系结构数据映射器的模式


像所有的缩写词一样,它是模棱两可的,但我假设它们是指对象关系映射器——一种遮住你的眼睛,让你相信下面没有SQL,而是所有的对象;-)。当然,不是真的,也不是毫无疑问的——总是色彩鲜艳的杰夫·阿特伍德(Jeff Atwood)将ORM描述为CS的越南。但是,如果您对SQL知之甚少或一无所知,并且有一个非常简单/小规模的问题,那么它们可以节省您的时间!-)


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


对于使用python的用户来说,storm是一个很好的选择。


这是一个很大的话题。拿起一本很好的冬眠书,它应该详细解释ORM,然后才能得到最基本的沙质冬眠材料。

网址:https://www.hibernate.org/


dalmp http://code.google.com/p/dalmp/对于目前支持redis/memcache/apc等多种缓存后端的php/mysql来说可能是个不错的选择。