三层架构数据访问
Posted
技术标签:
【中文标题】三层架构数据访问【英文标题】:3-Tier Architecture Data Access 【发布时间】:2015-06-17 04:28:49 【问题描述】:我正在考虑为 android 设备开发社交网络应用程序,我将使用位于 n 层架构逻辑层中的 RESTful Web 服务。
现在我对数据层和逻辑层有点困惑。我看到逻辑层的规则说“不应包含演示或数据访问代码”我得到演示代码部分,但可以肯定的是,如果我的 Web 服务是 php、mysql 和 Apache,例如,我将不得不有类似的东西
$result = mysql_query("SELECT entry, name, level, description FROM
users ORDER BY name") or die(mysql_error());
(忽略这个不使用 mysqli 的事实) 这不属于业务逻辑吗?机器上是否应该有第二个 Web 服务,其中包含将根据来自逻辑层的信息运行此代码的数据库?
【问题讨论】:
【参考方案1】:在 N 层应用程序中,最好将中间层与数据存储库的细节或内部工作分开。在某些项目中,这可能是多余的。
此抽象允许您切换 RDMS 或连接到多个 RDMS,而无需重写业务层逻辑。您的代码也将受益于模块化。
实现此目的的一种方法是使用 CRUD 封装所有数据库表(ORM 映射器使这变得简单)。此后,这些类将成为您的数据层。
例如,在数据层的***别,您可能有一个按用户 ID 返回用户列表的函数,这里用户是一个已定义的类,它具有与您的数据字段匹配的属性。因此,您不是返回一些系统数据表对象,而是返回您定义的用户对象的列表。
接下来,在您的业务层中,您插入或提供一个数据访问类,您可以从中获取用户列表(请参阅依赖注入)。您不需要知道,也不关心数据来自哪里。用户列表可能来自 MySQL、平面文件或远程 Web 服务。这就是为什么分离可能是一件好事。
这种方法的一些缺点是必须依赖第三方 ORM 映射器(它们可以加快开发速度),需要翻译类来进行跨界通信,即使是最小的调整也会涉及更多的计划。但是,如果每个实体都有 CRUDS,则最后一点不太可能。仅当您更改基础数据的属性时才需要进行调整。
编辑:我忘了提到用户存储库的 Get/Update/Insert/Delete 功能通常可以通过隐藏在远程 Web 服务或类似东西中的 api 访问。
【讨论】:
在使用 ORM 时,您仍然使用 JSON 将数据暴露给表示层吗? ORM 只是省去了编写 SQL 查询的麻烦? Restful Api 可以返回 JSON 结果,并且最常见。 所以你将对象从数据库中拉出来,并将它们存储为 PHP 类的对象,然后将对象转换为 JSON 字符串? 这将是您与 Web 应用程序一起开发的东西。如果您想为您的应用程序创建一个 Restful Api,那么您需要认真考虑您希望如何组织您的数据访问并创建一个 api 并公开您的端点。您的客户端应用程序将使用该 api 并将输出呈现给用户。但是,如果您的 API 返回由您决定的 json,那么一旦您决定了语义,就不应更改。您还可以考虑多种输出类型。通过路由,您可以使用类似于 www.apiserver/myapp/您的数据访问层包含从数据源中提取数据的查询。这些查询通常位于某种存储库接口之后,该接口允许其他层以松散耦合的方式与数据访问层进行通信。
您的逻辑(也称为业务)层包含完成表示层调用的操作所需的工作流。在分层架构中,该层不应该包含原始数据访问查询,而是应该使用数据访问层通过上面提到的存储库接口查询数据。我认为这就是该规则想要表达的意思。
【讨论】:
以上是关于三层架构数据访问的主要内容,如果未能解决你的问题,请参考以下文章