2

我试图确定在构建数据层时使用对象到关系映射层(如休眠或 Microsoft Entity 框架)是否有任何优势或劣势。

从长远来看,是手动使用 sql 和映射对象更好,还是利用其中一种映射技术更好?

对于简单的应用程序来说,额外的映射层似乎是有利的,因为该工具可以处理简单的映射和 sql,因此可以节省一些时间,但是当您的对象模型变得更加复杂时呢?

如果有的话,还有什么性能影响?

感谢您提供的任何见解。

4

4 回答 4

4

您最好的选择是确保无论您做什么,您都可以在以后进行更改。因此,如果您使用 NHibernate 或 EF,您将希望对框架的实际依赖关系保持在一个非常严格的范围内;手动实现也一样。

尝试实施存储库模式,然后您可以构建 NH-repo、EF-repo 等,看看哪个最适合您的需求。

我个人的意见是进行正确的 OR-Mapping(无论是手动还是通过框架)——这意味着您的业务/域对象不仅看起来像您的表,反之亦然。ORM 的全部意义不仅仅是将数据从数据库中取出并输入您的应用程序(DataSets 很好),而是让您在应用程序中利用 OOP 的两全其美,并后端中的 RDBMS。

如果您只是将 SQL 用作“哑存储”(我最喜欢使用它),那么您可以考虑使用 OODB 或其他对象持久性方法。在业余爱好/业余项目中探索这始终是一件有趣的事情——但很难将其出售给管理层(他们喜欢他们的 SQL Server),但值得考虑。


当然,如果你说的是非常小的应用程序,那么也许你可以按照 Active Record 模式或事务脚本模式来实现一些东西——XScript 非常适合非常小的应用程序,但不能很好地扩展——并且 Active Record 非常适合数据输入/CRUD 应用程序

于 2010-07-01T21:59:53.180 回答
2

对于简单的应用程序来说,额外的映射层似乎是有利的,因为该工具可以处理简单的映射和 sql,因此可以节省一些时间,但是当您的对象模型变得更加复杂时呢?

其实,我想说的恰恰相反。

在具有复杂对象模型的大型应用程序中使用 ORM 更有意义:

  • 对于具有简单 DB 模型的非常小的应用程序,ORM 可能是多余的,因为持久层将很容易实现而不会在某处引入错误,并且 ORM 不会为您节省很多工作。

  • 另一方面,对于具有更复杂数据库数据模型的大型应用程序,您JOIN的 s 和您UPDATE的 s 等更容易出错,因此 ORM 可能真的很有帮助。

于 2010-07-01T22:00:05.100 回答
1

如果这是一个“我应该使用 ORM 还是不使用?”的问题。那么您的问题没有绝对的答案,每种方法都有取舍,包括积极和消极方面。

ORM 可以帮助您快速启动和运行,尤其是在您拥有更大的数据模型时。如果您需要生成多个不同的持久层,它们也可能非常出色,因为您使用相同版本的产品支持多个数据库供应商。ORM 并不像以前那么糟糕,如今它们的效率相当高。

就我个人而言,虽然我不是它们的粉丝——我认为如果你对你的数据库技能有一半的精通,那么你应该使用它们。我认为 ORM 倾向于保护开发人员免受数据库复杂性的影响,这不一定是一件好事。我喜欢调整我的数据访问和存储,虽然编写代码以将数据集映射到域对象可能很乏味,但它并不难或容易出错,而且我始终知道发生了什么,任何地方都不会发生魔法. 如果存在性能问题或效率低下,那么我可以非常快速地追踪并修复它们。

于 2010-07-01T22:19:01.800 回答
1

您可以构建自己的 ORM 映射工具。例如这里 http://askcodegeneration.com/php/generate-propel-schema-for-php-symfony/

一个推进 orm 模式是从一​​个简单的描述类格式生成的(没有什么可以阻止像 c# 和像 Hibernate 这样的任何 orm 框架的任何其他语言,事实上在未来我打算这样做):

class-list: [question answer user interest relevancy]

Sample-Model: {

  class question [

    Id: 0
    title: ""
    body: ""
    created_at: 'now
    updated_at: 'now
    user_Id: [User]

  ]

  class answer [

    Id: 0
    question_Id: [question]
    user_id: [user]
    body: ""
    created_at: 'now
    updated_at: 'now

  ]

  class user [

    Id: 0
    first_name: ""
    last_name: ""
    created_at: 'now
  ]

  class interest [
    question_id: [question]
    user_id: [user]
    created_at: 'now
  ]

  class relevancy [
    answer_id: [answer]
    user_id: [user]
    score: 0
    created_at: now
  ]

}
于 2010-07-01T22:25:49.397 回答