使用MVC方法对用户,组,组合和媒体建模

时间:2009-05-20 23:20:48

标签: model-view-controller database-design cakephp data-modeling

我正在为一个项目创建一个使用MVC范例(在CakePHP中)的社交网站的简单设计, 我有一个名为Users的表存储所有用户详细信息,我有一个存储所有组详细信息的组表,这两个模型之间的关系是并且属于很多,然后我有一个group_portfolios表存储属于的所有组合一个组和一个user_portfolio表,用于存储与用户相关的所有投资组合信息。 用户可以拥有多个投资组合 一个组可以有多个组合 用户可以拥有许多媒体 一个小组可以有很多媒体

我已将与用户和群组相关联的媒体功能分开,我的问题是,

1)我是否正确思考MVC应用程序的建模方法? 2)由于我将用户和组的功能分开,我最终会得到2个表,用于与媒体和投资组合相关的所有信息。这是否会导致任何冗余和性能相关的问题,尤其是在搜索投资组合等时? 3)当我想稍后添加更多功能时,这是否能够扩展? 4)有没有更好的方法来建模系统?

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用单个媒体和单个投资组合表。添加一个额外字段,告诉您它是属于用户还是组。然后,不要将$ belongsTo属性添加到模型中,而是使用bindModel方法动态附加正确的模型。

或者你也可以使用UUID(mysql:varchar 36)代替你的ID的整数。 UUID永远不会发生碰撞。因此,您可以使用相同的字段将投资组合和媒体属于用户组。这是有效的,因为在使用UUID时,永远不会有用户具有与组相同的ID。例如:

class Media {
    $belongsTo = array(
        'User' => array('foreignKey' => 'parent_id'),
        'Group' => array('foreignKey' => 'parent_id'),
    );
}

前者在技术上更正确。后者更容易实现,您可能不喜欢长UUID创建的较长URL。

修改:为了解决您对唯一性的评论,UUID旨在全球唯一。也就是说,您不仅不会在自己的数据库中有重复项,而且世界上不应该有任何重复项。任何地方。

有关使用UUID的双重内容的概率,请参阅this Wikipedia article。短篇小说:在产生70,000亿UUID之后,甚至只有一个重复的概率是100亿分之四。你有更好的机会在同一天被闪电击中两次: - )

答案 1 :(得分:1)

对于Sander Marechal关于GUID的说法,您可能需要考虑媒体模型的PolymorphicBehavior。它会加速你的应用程序,你不必担心任何时候关系破裂。

关于您的设计问题..我们并不真正了解您的应用,也无法提供任何详细的答案。不,这是谎言:我不想提供可能错误的答案。

但是,我可以给你一些提示。 :)你应该坐下来画出你的模特关系,并思考如何在现实生活中使用它们。然后看看是否有任何遗漏,或者可能有太多的东西。优化和最小化从数据库返回的数据。这里的关键概念是简单。如果它不是那么简单,它是错的

如果你走了一半并意识到你犯了设计错误 - 承认你犯了设计错误并修复它!有时你无法预测一切,也没有羞耻(好吧,只要你学到东西......)。

答案 2 :(得分:0)

我使用过RoR和Castle,而不是CakePHP,所以我会用一般的话来说。

1: 你一直在做什么以及你应该继续做什么被称为'领域建模' - MVC非常适合你,因为你的模型成为你的领域模型中对象的表示

2: 您可以更改投资组合和媒体模型,而不是引用其父级的ID,您有一个'ObjectId'和'ObjectType' - ObjectId是父ID的ID,ObjectType是类型。您将无法自动连接关系,但可以使用自定义代码执行此操作,因此为用户获取所有媒体

select * from Media where ObjectId = [userid] and ObjectType = 'User'

而不是

select * from UserMedia where UserId = [userid]

3: 是的,这是一个可扩展的设计。记得将模型特定的工作推送到模型本身(或存储库)中以使其“正常工作”

4: 也许,但你永远不会得到一个“完美”的系统。 MVC很棒,你的设计对于简单的社交网络来说似乎很有用。毫无疑问,你会添加帖子/评论等内容。