2009-07-20 91 views

回答

45

From wikipedia

对象关系映射(ORM,O/RM, 和O/R映射)在计算机软件 为在关系数据库中不相容 类型系统之间 转换数据的编程技术 和面向对象编程 语言。这实际上创建了 “虚拟对象数据库”,其可以使用 语言编程的 。有免费和 商业软件包可用 执行对象关系映射, 虽然一些程序员选择 创建自己的ORM工具。

这对抽象数据存储(平面文件/ SQL /其他)为了提供一个可以在您的代码中使用的接口很好。例如,(在轨),而不是构建SQL找到一个用户表中的第一个用户,我们可以这样做:

User.first 

这将返回美国我们的用户模型的实例,与第一属性用户在用户表中。

0

维基百科: http://en.wikipedia.org/wiki/Object-relational_mapping

对象关系映射(ORM,O/RM,和O/R映射)在计算机软件是用于在关系数据库和对象 - 不兼容的类型的系统之间进行转换数据的编程技术面向对象编程语言这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。虽然有些程序员选择创建他们自己的ORM工具,但是有免费和商业软件包可以执行对象关系映射。

优点和缺点 ORM通常会减少需要编写的代码量,使软件更健壮(程序中的代码行越少,其中包含的错误越少)[1]。

使用O/R映射有成本以及好处。例如,一些O/R映射工具在批量删除数据时表现不佳。存储过程可能具有更好的性能,但不便携。

213

一个简单的答案是,你换你的班表或存储过程中的编程语言,以便不用编写SQL语句来与数据库进行交互,您使用的方法和对象的属性。

换句话说,而不是像这样:

String sql = "SELECT ... FROM persons WHERE id = 10" 
DbCommand cmd = new DbCommand(connection, sql); 
Result res = cmd.Execute(); 
String name = res[0]["FIRST_NAME"]; 

你做这样的事情:

Person p = repository.GetPerson(10); 
String name = p.FirstName; 

或类似的代码(很多在这里的变化。)一些框架也投入了大量的代码作为静态方法在类本身,这意味着你可以做这样的事情,而不是:

Person p = Person.Get(10); 

有的还实现复杂的查询系统,所以你可以这样做:

Person p = Person.Get(Person.Properties.Id == 10); 

该框架是什么让这个代码成为可能。

现在,好处。首先,你将SQL隐藏在逻辑代码之外。这有利于您更轻松地支持更多的数据库引擎。例如,MS SQL Server和Oracle在典型函数上有不同的名称,以及使用日期进行计算的不同方法,因此,“让我所有人在过去24小时内编辑”的查询可能需要不同的SQL语法,仅用于这两个数据库引擎。这种差异可以放在您的逻辑代码中。

此外,您可以专注于编写逻辑,而不是获取所有SQL权限。代码通常更易读,因为它不包含与数据库交谈所需的所有“管道”。

+33

我想,当维基百科将开始给予这样简单和复杂术语的有意义的定义。 – Faizan 2013-04-24 03:42:31

0

它允许你做这样的事情(这是教义代码):

$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false'); 
foreach($activeUsers as $user) 
{ 
    $user->active = true; 
    $user->save(); 
} 
3

ORM是:

的抽象,像任何抽象它使生活变得更容易。

7

数据库通常在关系模型上工作:您有表格(简化:像电子表格一样),以及它们之间的关系 - 一对一,一对多,多对多等,例如表A中的一条记录在表B中有许多相关记录。您可以从它们中检索数据作为行(表示来自表/表的行的值的集合)More in wikipedia

现代编程语言使用对象模型。对象具有方法,属性(简单或复杂)等。

ORM软件会在这些模型之间进行转换。例如,它将来自表B的所有相关记录放入对象A的属性中。这种软件使得使用关系数据库(最流行的类型)与对象编程语言更容易。

0

对象关系映射(ORM)库提供了数据库表到域对象类的映射。

3

无论何时使用ORM(对象关系映射器),您都可以并排找到DBAL(数据库抽象层)。所以它有必要知道这些是什么,以便了解你正在使用什么以及你将获得的优点是什么。

DBAL(数据库抽象层)

它作为你的代码和数据库之间的层。无论您的数据库是什么,写入的代码都可以很好地进行调整。

假设对于当前的项目,您使用MySQL一旦完全成熟并获得巨大流量,您的团队计划将数据库切换到Oracle,出于某种原因,那么您在MySQL中编写的代码必须重写为基于Oracle的查询。重写整个项目的查询是一项乏味的任务。

相反,如果您使用任何DBAL库,那么您可以切换数据库的配置,并确保您的项目将在一天内启动并运行(可能会进行一些小调整)。

ORM(对象关系映射器)

对象关系映射(ORM)是从面向对象的语言访问关系数据库的技术(设计模式)。

如果您已经使用过Symfony(如果您来自PHP背景)/ Hibernate(Java)等任何类型的框架,那么您就熟悉这些框架。它只是实体

为了在面向对象的上下文和接口中访问数据库,翻译对象逻辑是必要的,这个接口被称为ORM。它构成了访问数据并保留业务规则的对象。

例如,

class User{ 
    private $email; 

    private $password; 

    public function setEmail($email){ 
     $this->email = $email; 
     return $this; 
    } 

    public function getEmail(){ 
     return $this->email; 
    } 


    public function setPassword($password){ 
     $this->password = $password; 
     return $this; 
    } 

    public function getPassword(){ 
     return $this->password; 
    } 
} 

/* To save User details you would do something like this */ 
$userObj = new User(); 
$userObj->setEmail('sanitizedEmail'); 
$userObj->setPassword('sanitizedPassword'); 
$userObj->save(); 

/* To fetch user details you would do something like this */ 
$userObj = new User(); 
$userDetails = $userObj->find($id); 

例如, DoctrinePropelRedBean