我实际上被困在三层结构中。我浏览了互联网,并发现了两个术语“数据库抽象层”和“数据访问层”。
这两者之间有什么区别?
我实际上被困在三层结构中。我浏览了互联网,并发现了两个术语“数据库抽象层”和“数据访问层”。
这两者之间有什么区别?
数据访问层=针对你的应用程序领域创建、读取、更新、删除(CRUD)操作
数据抽象层=执行通用数据库操作,如连接、命令、参数,使你隔离特定于供应商的数据库库,并提供一个高级API来访问数据,无论你是否使用MySQL、Microsoft SQL Server、Oracle、DB2等...
我的理解是,数据访问层并不实际抽象数据库,而是使数据库操作和查询构建更加容易。
例如,数据访问层通常具有非常类似SQL语法的API,仍然需要了解数据库的结构才能编写:
$Users->select('name,email,datejoined')->where('rank > 0')->limit(10);
数据抽象层通常是完整的ORM(对象关系映射器),理论上可以避免了对底层数据库结构的理解或对SQL的任何知识。其语法可能如下所示:
Factory::find('Users', 10)->filter('rank > 0');
所有对象都可以完全填充所有字段,并可能与任何父对象或子对象连接,如果您设置了这种方式。
但是,这种抽象是有代价的。我个人认为,像Doctrine或Propel之类的ORM是不必要且效率低下的。在大多数情况下,一个简单的数据访问层就足够了,对于需要特殊注意的任何内容,手动使用SQL即可,而不必为了一些语法糖而破坏应用程序的性能。这个领域是一个相当激烈的辩论,所以我不会再深入探讨了。
如果您指的是数据库抽象层,那么它可能类似于PDO,以便您的代码可以用于更多的数据库供应商。我相信PDO可以与MySQL、PostgreSQL和mysqli等数据库一起使用。
来自维基百科:
计算机软件中的数据访问层(DAL)是程序的一层,它提供对持久存储中存储的数据的简化访问,例如实体关系数据库。例如,DAL可能返回一个对象的引用(在面向对象编程方面),其中包含其属性,而不是来自数据库表的字段行。这允许使用更高级别的抽象创建客户端(或用户)模块。通过创建一组直接引用相应的一组数据库存储过程的数据访问方法类,可以实现这种模型。另一种实现可能会从文件系统检索或写入记录。 DAL将底层数据存储的复杂性隐藏在外部世界之外。例如,可以创建一个类和一些存储过程来访问特定数据库表,而不是使用诸如插入、删除和更新之类的命令。该类中的方法将调用存储过程,该存储过程将返回包含请求值的对象。或者,可以在数据访问层中执行类似于registeruser或loginuser的简单函数中的插入、删除和更新命令。基本上,它是一种额外的抽象层,使您可以针对供应商无关的接口进行CRUD操作,并更少地担心各种数据库供应商的实现细节。只有在您想要支持多个数据库时才需要使用此功能。ORM、Micro ORM、wrappers、generic driver classes等处理连接建立、参数处理、执行等的内容都在此处。这只是一个额外的层,就在Persistence/Storage层之前。在三层术语中,这两个层次都属于同一个层次,因为它们在逻辑上不是分开的。数据库抽象层是应用程序编程接口,它统一了计算机应用程序和数据库(如SQL Server、DB2、MySQL、PostgreSQL、Oracle或SQLite)之间的通信。传统上,所有数据库供应商都提供专门针对其产品定制的接口,这使得应用程序员必须为他或她想要支持的所有数据库接口实现代码。数据库抽象层通过提供一致的API减少了开发人员的工作量,并尽可能地隐藏了数据库特定的内容。有许多具有不同接口的抽象层在众多的编程语言中存在。