设计问题:symfony2,doctrine2,mysql DB

时间:2012-03-30 11:39:59

标签: mysql design-patterns symfony doctrine-orm

我想知道如何设计这个最佳,所以我不重新发明轮子

我有评级实体:

    /**
 * Type of the read of this comment,for example quality
 *
 * @ORM\Column(type="string")
 */
protected $type;
/** @ORM\Column(type="datetime") */
protected $created;

/** @ORM\Column(type="integer") */
protected $thread;
/**
 *
 *
 * @ORM\ManyToOne(targetEntity="User")
 */
private $user;

/**
 * @ORM\Column(type="decimal", scale=2)
 */
protected $value;

其中type是评级的类型,例如“file.quality”或“file.story”,用于共享视频。

现在我想打开视频的详细信息页面,并显示总评分(作为所有用户的平均值....还有评级,与用户无关,但来自其他地方。 ...喜欢IMDB(互联网电影数据库)评级。

我正在考虑添加CompleteRating实体,每当用户向Rating实体添加新投票时,我会保存平均评分并直接更新。也许是通过symfony2中的一个监听器类。

这是最好的设计方式吗?你怎么处理这个最好的?

1 个答案:

答案 0 :(得分:1)

我相信有两种方法可以做到,无论是否有最佳方式,实际上取决于您希望评级更新的频率,是否要让服务器受到压力等等

1)您的视频实体中可能有两列,CompleteRating,LastRatingUpdateTime。 在您的存储库中,您可以拥有一个GetRating函数,无论何时调用它都会检查上次更新时间,如果比较上一次评级更新一小时后,则运行更新评级并输出新评级的数据库查询。这当然意味着用户必须等待看他们的投票数,但这意味着服务器压力会降低。

2)也许你可能讨厌两个单独的评级,1个外包评级(IMDB等)只能通过cronjob每晚更新,然后是个人评级,可以在用户添加评级时计算,甚至只是在苍蝇,数据库在这种情况下非常快。

我的投票结果为2,这实际上取决于您为获取IMDB评级所采用的代码的密集程度。