数据访问层的目的是什么?

26

很久以前我启动了一个项目,并在我的解决方案中创建了一个数据访问层项目,但从未在其中开发任何内容。数据访问层的目的是什么?有没有一些好的资源可以让我了解更多关于数据访问层的知识?

10个回答

34

简而言之:松耦合

将从数据存储(数据库、平面文件、Web服务等)中提取数据的代码与业务逻辑和表示层代码分离。这样,如果您必须更改数据存储,就不必重写整个程序。

如今,各种ORM框架有点混合了数据访问层和其他层。这通常使开发更加容易,但更改数据存储可能会很痛苦。公平地说,那样更改数据存储是相当罕见的。


2
这样,如果您必须更改数据存储,您就不会最终重写整个程序。您真的会更改数据存储吗?除非您从一开始就计划这样做,否则我怀疑。 - Jonathan Allen
嗯,在一些项目中我经常这样做。在我的开发环境中,我使用SQLite,在生产环境中则使用MySQL。不过,我使用的框架(Pylons)使得这很容易实现。 - swilliams
我记得有很多类似于“你可能需要使用Oracle/MySql/SQL Server而不是SQLServer/Oracle/MySQL作为数据存储”的例子,但根据我的经验,由于工具和许可证是大部分商业项目的核心,这几乎从未发生。 - immutabl
2
仅将数据库模式的重大更改作为松耦合的原因,怎么样?例如,假设您在数据库的某些部分从标准化表更改为EAV表。 - Buttle Butkus

24

数据访问层的两个主要目的如下:

  1. 抽象实际的数据库引擎或其他数据存储,使您的应用程序能够从使用Oracle切换到使用MS SQL Server等

  2. 抽象逻辑数据模型,使您的业务层与此知识解耦,并且对其不关注,从而使您能够修改逻辑数据模型而不影响业务层

大多数答案都提供了第一个原因。在我看来,第二个原因更为重要。基本上,您的业务层不应该知道正在使用的逻辑数据模型。如今,随着ORM和Linq #2似乎被忽略,人们往往会忘记(或不能看到确实存在且应该存在的细微差别)。

基本上,要深入理解数据层的目的和功能,您需要从业务层的角度看待问题,并记住业务层应该不关心数据存储的逻辑数据模型。

因此,每次业务层需要数据时,它应该以非常简单且与逻辑数据模型无关的方式请求所需的数据。因此,它会调用数据访问层,例如:

GetOrdersForCustomer(42)

它恰好获取所需数据,而不知道存储此信息的表或存在的关系等内容。

我在我的博客上写了一篇更详细的文章。

数据访问层的目的和功能


更新链接。不再可访问。 - KNU

8
一个数据访问层遵循“关注点分离”的思想,即使您的业务逻辑需要与数据层(数据库)交互所需的所有逻辑都被隔离到一组单独的类(层)中。这使得您可以更轻松地更改后端物理数据存储技术(例如从XML文件移动到数据库,或从SQL Server移动到Oracle或MySQL),而不会对业务逻辑产生重大影响(如果正确执行,则完全没有影响)。
有许多工具可帮助您构建数据层。如果搜索“对象关系映射器”或“ORM”这个词组,您应该能找到更详细的信息。

这使您更轻松地更改后端物理数据存储技术,例如从XML文件移动到数据库,或从SQL Server移动到Oracle或MySQL。但我怀疑这种情况是否真的会成为事后的想法。 - Jonathan Allen
@Grauenwolf:虽然更改数据库并不经常发生,但是分离的做法仍然是“正确的做法”,在实践中更常见的是,您可能会改变访问现有数据的方式或调整某些功能,并将其放在一个地方。 - Slartibartfast

8

当应用程序的许多不同部分需要以相同的方式访问数据时,数据访问层是有意义的。

当您需要以许多不同的方式访问相同的数据时,这也是有意义的。例如,文字处理器可以读取许多不同的文件类型并将它们静默地转换为应用程序的内部格式。

请记住,数据访问层也可能非常低效。如果您正在构建一个关键性能为数据访问的系统,则将其与业务逻辑分离可能会使一些重要的优化变得不可能。


1
我所做的是在我的BAL中实现数据访问。 - Bryan Roth
1
我开玩笑的,我是说BLL(业务逻辑层)。 - Bryan Roth

7

数据访问层(DAL)应该将数据库与项目的其他部分分离 - 基本上,除了DAL之外,任何代码中都不应该有SQL,并且只有DAL应该知道数据库的结构。

主要目的是隔离应用程序的其余部分免受数据库更改的影响,并使扩展和支持应用程序变得更容易,因为您始终会知道去哪里修改与数据库交互的代码。


如果我把数据访问放在我的BAL中会怎样? - Bryan Roth

1

目的是将数据库访问细节抽象出来,以便应用程序的其他部分无需关注。


1

数据访问层用于抽象化数据的存储和检索过程。你可以在1994年的设计模式中了解更多关于这种抽象化的内容。


1

目的是将数据存储检索机制与数据使用和操作分离。

好处:

  • 底层存储可以更改(例如从Oracle切换到MSSQL),您需要一种本地化这些更改的方法
  • 模式更改-见上文
  • 您希望以脱机方式运行您的数据库(演示模式):向DAL添加文件序列化/反序列化

0

我建议你在这里阅读: http://msdn.microsoft.com/en-us/practices/default.aspx

使用数据访问层(DAL)将有助于将数据访问与演示和业务逻辑隔离开。 我经常使用它,因此可以轻松地通过反射和动态加载程序集来交换数据提供程序。

阅读这里,有很多有用的信息。

另外,如果您计划使用.NET,请查看 Data Access Block ,它可以提供很大的帮助。


0
有一点我想补充的是,拥有数据访问层(DAL)可以提高系统的安全性。例如,数据库和数据访问层可以运行在对公众不可访问的服务器上,而业务逻辑可以运行在面向公众的服务器上,这样公众服务器就无法直接在数据库上运行原始的SQL语句。这可以在公众服务器被攻击时减少很多损害。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接