表模块与域模型

时间:2009-01-11 22:03:38

标签: database design-patterns database-design entity-attribute-value

我前几天询问Choosing a method to store user profiles并收到interesting response from David Thomas Garcia建议我使用表模块设计模式。看起来这可能是我想要的方向。我在谷歌看到的所有内容似乎都是相当高级别的讨论,所以如果有人能指出我的方向,或者让我更好地了解所涉及的基本要素,那将是非常棒的。

1 个答案:

答案 0 :(得分:34)

最佳参考是Martin Fowler撰写的“企业应用架构模式”:

以下是表格模块部分的摘录:

  

表模块组织域   每个表中有一个类的逻辑   数据库和单个实例   class包含各种程序   这将对数据起作用。该   与域的主要区别   模型是,如果你有很多   订单,域模型将有一个   表中每个订单的订单对象   模块将有一个对象要处理   所有订单。

表模块在您为用户配置文件数据描述的灵活数据库体系结构中特别有用,基本上是Entity-Attribute-Value设计。

通常,如果使用域模型,则基础表中的每一行都将成为一个对象实例。由于您将用户配置文件信息存储在多行中,因此您最终必须创建许多域模型对象,而您真正想要的是一个封装所有用户属性的对象。

相反,表模块使您可以更轻松地编写适用于底层数据库表中多行的逻辑。如果为给定用户创建配置文件,则指定所有这些属性,Table Module类将具有将其转换为一系列INSERT语句的代码,每个属性一行。

$table->setUserProfile( $userid, array('firstname'=>'Kevin', 'lastname'=>'Loney') );

同样,查询给定用户的配置文件将使用表模块将查询结果集的多行映射到对象成员。

$hashArray = $table->getUserProfile( $userid );