代码之家  ›  专栏  ›  技术社区  ›  chaos

DAL和ORM之间的界线在哪里?

  •  36
  • chaos  · 技术社区  · 16 年前

    这些术语通常是可以互换的,显然有相当大的重叠,但正如它经常暗示的那样,人们通过说一个系统是一个ORM,而不是一个DAL所暗示的,看到了强烈的暗示。那是什么?如果有的话,区分这些系统类型的关键点是什么?

    例如,假设我有一些代码实现了数据库、表、列和行类,通过对现有数据库的自动分析填充它们,允许简化交互等等。它理解、执行和利用数据库实体(如外键)之间的结构关系。可以对所有实体模型进行子类化,以便将特定于表的功能加载到这些模型上。

    这在多大程度上是一个DAL?它在多大程度上是ORM?为什么?

    4 回复  |  直到 16 年前
        1
  •  52
  •   Steven A. Lowe    16 年前

    ORM=对象关系映射

    在ORM中,应用程序中的类/对象被映射到数据库表和持久化操作,有时是自动的。

    dal=数据访问层

    在DAL中,数据库操作隐藏在代码外观后面。

    ORM是一种DAL,但并非所有DAL都是ORM。

        2
  •  7
  •   matt b    16 年前

    我认为ORM能够将任何一组对象映射到关系数据库;而DAL是特定于您的应用程序的,可能无法自然地扩展到支持其他对象。

    不仅如此,ORM还特别关注 映射 与数据库实体之间的类,而DAL可能只是一种访问数据库中数据的方法,而不需要任何映射。

        3
  •  5
  •   Ty.    16 年前

    任何面向对象的DAL连接到任何不保存对象的存储系统,都会实现ORM。ORM通常被理解为类似于Hibernate的意思,但重要的是处理阻抗不匹配。

    [扩大]

    在数据级别,当您将一种类型(关系型)的数据映射到另一种类型(OO)的数据时,会出现阻抗不匹配。

    例如,您在DAL中看到过多少次类似下面的线条?

    db.AddInParameter(dbCommand, "Name", DbType.String, name);
    

    或者另一边

    customerId = Convert.ToInt64(dr["CustomerID"].ToString());
    

    映射原始数据类型时会出现许多问题。

    在对象级别,DAL应该返回您打算使用的结构。可能是某种业务对象,也可能只是一堆原始数据。你自己的DAL和ORM都需要处理这个问题。

    在设计级别,您构建的对象反映了您存储的数据。因此可能会出现结构差异。这些也在ORM解决方案中为您处理,但您将被迫在DAL中执行相同的操作。例如,在OO代码中实现适当的继承是很好的,但这并不容易转化为关系型的东西。

    我只是想指出,ORM是一个专门用来推动产品自动化的术语,在DAL中你已经需要做很多事情。ORM解决方案将使生活更轻松,并提供大量质量/性能优势。但这并不能改变这样一个事实,即DAL的主要组成部分之一就是创建自己的ORM。

        4
  •  3
  •   Hector Sosa Jr    16 年前

    当我开始编程时,ORM不存在。当第一个窗体出现时,它们是用于创建DAL的外部工具。现在天,达尔和奥姆混在一起了。这就是为什么许多开发人员可以互换使用这些术语的原因。

    作为DAL的ORM最著名的例子是NHiberonate。其他例子包括亚音速和csla.net。这些都是.NET工具。IRC,ORM工具开始于Java世界。其他技术栈随后复制了Java所做的事情。