表模块与域模型
Posted
技术标签:
【中文标题】表模块与域模型【英文标题】:Table Module vs. Domain Model 【发布时间】:2010-09-30 20:01:25 【问题描述】:前几天我询问了Choosing a method to store user profiles,收到了interesting response from David Thomas Garcia,建议我使用表格模块设计模式。看起来这可能是我想要采取的方向。我在 Google 上出现的所有内容似乎都是相当高水平的讨论,所以如果有人能指出一些示例的方向或让我更好地了解所涉及的具体细节,那就太棒了。
【问题讨论】:
【参考方案1】:最好的参考是 Martin Fowler 的“企业应用架构模式”:
这是表格模块部分的摘录:
一个表格模块组织域 每个表一个类的逻辑 数据库和单个实例 类包含各种程序 这将对数据起作用。这 与域的主要区别 模型是,如果你有很多 订单,领域模型将有一个 每个订单的订单对象,而 Table 模块 将有一个对象来处理 所有订单。
表模块在您为用户配置文件数据描述的灵活数据库架构中特别有用,基本上是Entity-Attribute-Value 设计。
通常,如果您使用域模型,则基础表中的每一行都会成为一个对象实例。由于您将用户配置文件信息存储在多行中,因此您最终必须创建许多域模型对象,而您真正想要的是一个封装所有用户属性的对象。
相反,表格模块使您可以更轻松地编写适用于基础数据库表中多行的逻辑。如果您为给定用户创建配置文件,您将指定所有这些属性,并且 Table Module 类将具有将其转换为一系列 INSERT
语句的代码,每个属性一行。
$table->setUserProfile( $userid, array('firstname'=>'Kevin', 'lastname'=>'Loney') );
同样,查询给定用户的个人资料将使用表格模块将查询结果集的多行映射到对象成员。
$hashArray = $table->getUserProfile( $userid );
【讨论】:
谢谢,经过大量阅读和思考,灯亮了。 感谢您很好地解释了它们之间的区别。 @BillKarwin 应数据表实体(定义在业务层,BL),例如这里的“用户”或“用户配置文件”,有任何数据访问问题吗?例如,如果数据访问使用基于属性的映射来实现数据访问的对象。 BL 数据表实体是否应该带有这些属性?它不会将 BL 与数据访问细节结合起来吗?我正在尝试在表模块实现中建立 BL 和 DAL 之间的关系。 @fallow,最终你必须有 some 类知道如何以存储方式访问数据。请记住,在 OOP 中创建“层”的目的是保持交换不同实现的灵活性。如果您没有这种需求,那么创建更多的抽象和层就没有什么价值了。 @BillKarwin 非常感谢您的评论。需要明确的是,如果不需要灵活性,您不建议结合 BL 和 DAL。您是建议在 BL 实体中包含这些属性可能是一个合适的折衷方案;对吗?以上是关于表模块与域模型的主要内容,如果未能解决你的问题,请参考以下文章