一起为多个表设计 Zend 模型?

Posted

技术标签:

【中文标题】一起为多个表设计 Zend 模型?【英文标题】:Designing a Zend model for multiple tables together? 【发布时间】:2011-01-22 14:45:28 【问题描述】:

我正在使用 Zend Framework 构建一个 Web 界面,用于为自定义 CMS 的用户设置 ACL(权限)。由于 ACL 数据分布在 5 个表中(用户、组、权限、urls=action+controller,用户可以理解的好权限名称)并且我只有一个具有四个基本 CRUD(创建、列出、更新、删除)的控制器) 操作我想知道最好的方法是什么?

我在书中看到的所有示例每个模型都扩展 Zend_Db_Table_Abstract 并因此代表一个表

我在想我必须做一个不扩展 zend_db_table_abstract 的模型,然后手动编写我需要的查询,从而将自己限制在 mysql 数据库中?

附言请不要争论acl数据库结构

谢谢

【问题讨论】:

【参考方案1】:

definition of the Table Data Gateway pattern 是

充当数据库表网关的对象。一个实例处理表中的所有行。

这就是为什么您不会看到它在 Zend Framework 中的使用方式有任何不同。这是一个Data Source Architectural Patterns,而您要问的是一个特定于域的类。

您遇到的是Impedance Mismatch,这意味着您的业务对象与您的数据库设计的结构不匹配。常见的解决方案是使用DataMapper 或ORM 为您处理。

另一种解决方案是在您的数据库中创建一个视图,该视图以 1:1 映射到您所需的业务对象的方式连接表。然后为该视图添加Zend_Db_Table。不过,您仍然必须提出自定义创建、更新、删除逻辑。虽然这不是数据映射,但如果您没有要映射到的任何业务/域类,那很好。

【讨论】:

所以如果我手动编写模型的 4 个函数(getAll、deleteById、create、updateById)就相当于数据映射正确吗? @max4ever 我不确定你对模型的定义是什么。模型不仅仅是数据库。数据库是持久层。它是模型的一部分,但它不是模型。模型中可能还有其他几个层。 对不起,我将模型设置为 MVC 模式中的 M,我认为数据库中的视图是不允许的,因此我可以在数据库中构建视图,而不是在数据库中构建视图在我上面描述的 4 个函数中使用“select ... from ...”查询进行相同的抽象,对吧? :// @max4ever 但要回答您的问题:您的映射器将成为域层和持久层之间的中介。它应该知道如何在域和持久层之间进行映射。这意味着,它应该知道在域上调用哪些方法以及在它们之间传输数据的持久层对象。它不应包含与数据库对话的逻辑或域对象的任何逻辑。 @max4ever 是的,你可以这样做。严格来说,那将不是一个 DataMapper,而是一个自定义的表数据网关。如果您的模型中没有专用的域层,那很好。

以上是关于一起为多个表设计 Zend 模型?的主要内容,如果未能解决你的问题,请参考以下文章

Zend 框架中如何设计领域层对象来表示多个对象和单个对象?

数仓设计--事实表

HBase数据模型解析和基本的表设计分析

HBase数据模型解析和基本的表设计分析

HBase数据模型解析和基本的表设计分析

数据库设计,根据下面的叙述:应该设计哪些表?都有啥字段?