ORM,AR,QB和& DM?

时间:2009-06-18 21:14:45

标签: php database orm activerecord object

好的,所以每个人都决定(并且有充分理由)海峡SQL是魔鬼。这给我们留下了许多方法,可以在我们的代码中放置一个“中间人”来将我们的代码与数据库分开。我现在要吐出我收集到的所有信息,希望有人可以设置我的海峡并告诉我我的建设。

ORM(对象关系映射)是一系列工具(松散或紧密集成的依赖),它将数据库行映射到应用程序中的对象。

在AR(Active-Record)中是一种ORM,其中数据库表或视图被包装到一个类中,因此一个对象实例绑定到表中的一行。

数据映射(DM)是一种ORM,它是在两个不同数据模型之间创建数据元素映射的过程。

这三个人都声称这样工作:

$user = new User();
$user->name = 'Fred';
$user->save();

通常使用类似这样的User类:

class User extends Model {
    // Specify the database table
    protected $table = "users";

    // Define your fields
    protected $fields = array(
        'id' => array('type' => 'int', 'primary' => true),
        'name' => array('type' => 'string', 'required' => true),
        'email' => array('type' => 'text', 'required' => true)
    );
}

使用此设置,您可以轻松获取行而无需编写SQL。

// users
$users = $user->fetch(array('id' => 3));

有些AR类看起来更像是这样:

$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');

好的,现在这是毛茸茸的地方。每个人和他的兄弟似乎对什么类型的代码落在哪里有不同的看法。虽然大多数人都同意AR或DM是一种ORM - 但有时候从DM那里告诉AR的线条似乎都会被涂抹。

我编写了一个使用单个对象($ db)的类,在该类中调用此对象,并处理SQL创建以保存/获取结果。

//Fetch the users
$results = $db->select('id, name')->where('id > 4')->get('users');

//Set them active
while($user = $results->fetch()) {
    $user->active = TRUE;
    $user->save();
}

所以问题是“它是什么?”,为什么人们不同意这些条款呢?

3 个答案:

答案 0 :(得分:5)

并不是说直接的SQL是魔鬼 - 有时候需要编写原始SQL来获取查询以执行你想要的方式。对我来说,ORM更多的是消除手工工作而不是其他任何东西(比如不惜一切代价避免使用SQL)。我只是不想用每个项目的所有手工制作的查询来设置我的所有代码对象。这只是一项荒谬的工作和思考。相反,ORM工具提供了一种很好的自动化方法来创建数据对象,否则需要大量的手动工作。现在我可以拥有自动单独的行对象,我可以扩展它并创建自定义函数,而不用考虑它。我可以从不同的表中检索相关的行,而无需手动编写该查询。

看起来您的User类示例来自phpDataMapper,如果是这样,它还有一些其他内置细节,如自动表迁移,因此您不必为表结构分发SQL文件以及一些辅助功能和其他东西。所有功能都旨在为您节省时间 - 这是主要目标。

AR和DM之间最重要的区别是ActiveRecord(AR)行知道它自己的数据存储,因此在每个行对象上都有保存/更新功能 - $ user-> save() - “记录“ 活跃”。另一方面,对于DataMapper(DM),每个单独的行根据定义不知道它自己的数据存储。该行更像是一个可以在代码中使用的哑值对象。映射器负责将对该行的更改转换回数据存储区 - $ mapper-> save($ user)。这是最重要的区别 - 您会发现大多数核心ORM功能在几乎所有实现中都是相同的。这主要取决于它如何在核心架构层面上进行组合。

答案 1 :(得分:4)

你也可以弥补首字母缩略词 ORM,RM DM无论如何......只是状态从一种媒介转移到另一种媒体并包含在函数/语义中。

Sun Microsystems Microsoft 一直使用Java和C#进行操作。让我们简单一点,给它一个新名字!真是个好主意。

如果你说ORM ..每个人都知道它是什么,它有多种形式。你的代码看起来像是Linq的东西。

没有魔法,但很多流行语和大惊小怪恕我直言。

答案 2 :(得分:0)

同意@Aiden Bell。但我认为你指出差异是正确的。我使用LINQ to SQL,在你的定义中,它只是ORM的Active-Record风格。对我来说这很有效,因为我在很多绿地应用程序上工作,并从数据库开始构建我的类。从那里我倾向于遵循领域驱动设计方法(我知道......这是一个类的第一个概念)与我生成的类一起工作。对我而言,这让我很快就会走上正轨。

话虽如此,我还使用过Entity Framework和NHybernate。实体框架是UBER数据映射器,NHybernate也是一个数据映射器,但没有那么复杂!我个人认为实体框架还有很长的路要走。如果我曾经需要更多的复杂性,例如在一个棕色地带的应用程序中,db是相当固定的,我需要让我的类来代表我的应用程序而不是我的数据库,那么我宁愿转向更多的东西。 NHybernate及其数据映射功能。

我认为这些工具中的每一个都有它的位置。说它们完全相同而不是它们是不公平的。活动记录很棒,因为它为我生成直接代表我的数据库的类。这在我创建数据库或数据库时非常有效地代表了我无处不在的应用程序术语和概念。当我有一个没有意义的固定数据库或清楚地映射到我的应用程序时,orms的映射类型工作,在这种情况下,我可以封装复杂性或缺少我的数据库中的通过映射功能创建一个丰富的域ORM工具。