0

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

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

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

谢谢你

4

3 回答 3

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 重复的概率的 Wikipedia 文章。简短的故事:在生成 700,000 亿个 UUID 之后,即使只有一个副本的概率也是 100 亿分之 4。您更有可能在同一天被闪电击中两次 :-)

于 2009-05-20T23:47:29.687 回答
1

除了 Sander Marechal 所说的关于 GUID 的内容之外,您可能还需要考虑媒体模型的PolymorphicBehavior。它将加速您的应用程序,您不必担心任何时候关系破裂。

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

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

如果你进行到一半并意识到你犯了一个设计错误 -承认你犯了一个设计错误并修复它!有时你无法预测一切,也没有什么可耻的(好吧,只要你学到了一些东西……)。

于 2009-05-21T11:07:09.297 回答
0

我使用了 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 很棒,你的设计对于一个简单的社交网络来说似乎很可靠。毫无疑问,您会添加帖子/评论等内容。

于 2009-05-20T23:37:27.790 回答