Model view controller 使用MVC方法对用户、组、投资组合和媒体进行建模

Model view controller 使用MVC方法对用户、组、投资组合和媒体进行建模,model-view-controller,database-design,cakephp,data-modeling,Model View Controller,Database Design,Cakephp,Data Modeling,我正在为一个项目使用MVC范式(CakePHP)创建一个简单的社交网站设计, 我有一个名为Users的表,它存储了所有的用户详细信息,我有一个Groups表,它存储了所有的组详细信息,这两个模型之间的关系是has,属于许多,然后我有一个group\u portfolios表,它存储属于一个组的所有投资组合,还有一个user\u portfolio表,它存储与用户相关的所有投资组合信息。 一个用户可以有多个公文包 一个组可以有多个投资组合 一个用户可以有许多媒体 一个组可以有许多媒体 我已经分离了

我正在为一个项目使用MVC范式(CakePHP)创建一个简单的社交网站设计, 我有一个名为Users的表,它存储了所有的用户详细信息,我有一个Groups表,它存储了所有的组详细信息,这两个模型之间的关系是has,属于许多,然后我有一个group\u portfolios表,它存储属于一个组的所有投资组合,还有一个user\u portfolio表,它存储与用户相关的所有投资组合信息。 一个用户可以有多个公文包 一个组可以有多个投资组合 一个用户可以有许多媒体 一个组可以有许多媒体

我已经分离了与用户和组相关的媒体功能,我的问题是

1) 就MVC应用程序建模而言,我的想法是否正确?
2) 由于我将用户和组的功能分开,因此我最终会得到两个表,其中包含与用户和组相关的所有信息,例如媒体和投资组合。这是否会导致冗余和性能相关问题,尤其是在搜索投资组合等时?
3) 当我以后想添加更多功能时,这是否能够扩展?
4) 是否有更好的方法对系统进行建模?


谢谢你

我用的是RoR和Castle,不是CakePHP,所以我将用一般术语来谈

1: 您一直在做的和应该继续做的被称为“域建模”——MVC非常适合这样做,因为您的模型成为域模型中对象的表示

2: 您可以将公文包和媒体模型更改为,而不是引用其父对象的id,您有一个“ObjectId”和“ObjectType”-ObjectId是父对象的id,ObjectType是类型。您将无法自动连接这些关系,但可以使用自定义代码进行连接,以便为用户获取所有媒体

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

select * from UserMedia where UserId = [userid]
3: 是的,这是一个可扩展的设计。记住将尽可能多的特定于模型的工作推到模型本身(或存储库)中,以使其“正常工作”

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

您可以使用单一媒体和单一公文包表。添加一个额外字段,告诉您它属于用户还是组。然后,不要将$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的复制的概率。短篇故事:在产生了70000亿个UUID之后,仅有一个UUID的概率是100亿分之四。你有更好的机会在同一天被闪电击中两次:-(<)/P> < P> Sander Marechal对GUIDs说的话,你可能想考虑一下你的媒体模型。它将加速你的应用程序,你不必担心任何时候关系破裂

关于您的设计问题。我们并不了解您的应用程序,也无法提供任何详细的答案。不,这是一个谎言:我不想提供一个潜在的错误答案

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


如果你半途而废,发现自己犯了一个设计错误——承认自己犯了一个设计错误,并加以纠正!有时你无法预测所有事情,也不觉得羞耻(好吧,只要你学到了一些东西。)

谢谢你的回答,但我对你提到的第2点有一些问题,所以你建议更改表中的字段?如何指定hasMany和belong之类的关系要使用这种方法,我必须编写自定义SQL吗?也许吧。正如我所说,我不知道具体的蛋糕。使用.NETActiveRecord,我将使用NHibernate表达式作为示例。这些关系仅用于生成访问您的ORM所需的代码-您可以使用自己的自定义代码覆盖它们UUID是保证唯一的,还是仅仅期望唯一?我认为从所有实际目的来看,它们都是,但我不认为它们在数学上是有保证的,对吗?