Zend_DB和MVC模型匹配数据库表

时间:2011-10-22 01:26:55

标签: php model-view-controller zend-framework relational-database composition

我一直在阅读Bill Karwin(Zend_DB的创建者)关于不直接与数据库表有关的模型的内容。 (我认为一些开发人员的模型是Zend_tables的直接扩展,这使得添加对象的memcached缓存更加困难,这是有道理的。)

Bill Karwin所说的是一个模型has表和isn't a表,但我仍在思考我的方式是正确的,因为它以面向对象的方式设计。

例如(仅举例):

A Monster has 1:M Mouth. a Mouth has 1:M Tooth. 

所以在我的数据库中我有5个表:

Monster: id, name, type
MonsterMouth: id, monster_id, mouth_id
Mouth: id, size
MouthTeeth: id, mouth_id, tooth_id
Tooth: id, size, shape, sharpness

然后是3个班级:

class Model_Monster { 
    private $id, $name, $type, $mouths = array();
    public function __construct ($id) {
        // Set properties from DB for supplied ID
        // Go through DB and add the mouths based on monster ID
    }

    public function countTeeth () {
        // Loop through each $mouths as $mouth and call $mouth->getTotalTeeth();
    }
} 
class Model_MonsterMouth { 
    private $id, $size, $teeth = array(); 
    public function __construct($id) {
        // Set properties from DB for supplied ID
        // Go through DB and add the types of teeth for this mouth ID
    }

    public function getTotalTeeth () {
        // return sizeof($teeth);
    }

}
class Model_Tooth {
    private $id, $size, $shape, $sharpness;
    public function __construct($id) {
        // Populate details based on ID passed
    }
}

然后我猜计算牙齿和东西的方法......

$monsterId = 1;
$monster = new Monster($monsterId);
// Count total teeth
$totalTeeth = $monster->countTeeth();

因此,一个怪物可以有许多不同的嘴,一个嘴可以有许多不同类型的牙齿。

在写完这篇冗长的帖子后,我认为我已经做对了Bill Karwin正在谈论那些5 Models而不是3 ...

的人

我有5 Tables,但只有3 Models因为有两个表来解决M:M表关系。

2 of the 3 Models使用组合来存储许多其他类型的对象。

如果一个怪物有10个口腔,大约10种不同类型牙齿的9-10k之间...这会是性能问题吗?我的意思是PHP会看到它:a,a,a,a,a,b,b5*a and 2*b。如果拥有1-100k的一个对象并迭代地将它们添加到一个复合项目中的速度很慢,那么我想我应该只有一个带有数字属性的项目,以说明该类型有多少。

如果我说得对,那么也许它可能对其他一些遇到问题的人有所帮助。

谢谢:D Dom

1 个答案:

答案 0 :(得分:3)

我不想在比尔蜥蜴嘴里说话,我认为不是多对多,而是更多地谈论你应该将商业模式的抽象概念与潜在的表现形式分开。它的。

重要的是,例如,不要依赖于业务模型中的字段与数据库/文档存储/ Web服务中的字段具有相同名称的事实,因为这使得它非常脆弱。

另外考虑一下,如果你的模型想要一个像“FullName”这样的字段,它是“FirstName”和“Surname”的简单连接。您可能不想将“FullName”与“FirstName”和“Surname”一起存储在数据库中,因为它是重复数据和更多工作以保持更新,但如果您的模型与底层表示紧密耦合,您可能要么需要a)在数据库中添加“FullName”或b)在模型中没有“FullName”的情况下直播。

通过保持清晰的分离,您可以在模型中使用“FullName”和生成它的一些代码,同时在数据库中只有“FirstName”和“Surname”。当然,如果您需要,它还可以更轻松地切换后端数据库技术。

从我的观点来看,关键的洞察力是,模型,不仅仅是它包含的字段,也是业务规则,验证以及可以对其执行的操作。该表只是存储支持该行为所必需的字段的便利位置。