【问题标题】:Design issue: symfony2 , doctrine2, mysql DB设计问题: symfony2 , 学说, mysql DB
【发布时间】:2012-04-14 02:15:09
【问题描述】:

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

我有一个评级实体:

    /**
 * 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 中的监听器类。

这是最好的设计方式吗?你会如何处理这个最好的?

【问题讨论】:

    标签: mysql design-patterns symfony doctrine-orm


    【解决方案1】:

    我相信有几种方法可以做到这一点,是否有最好的方法实际上取决于您希望您的评级多久更新一次,您是否希望服务器承受压力等等

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

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

    我的投票是 2,这实际上取决于您用于抓取 IMDB 评级的代码的密集程度。

    【讨论】:

    • 谢谢伙计,3. 在评级表中添加一个带有 IMDB 评级(非用户评级)的行,但用户 ID 为 0 或 null?我尝试了学说2,但它给了我一个错误,因为用户不存在......所以也许这是另一种解决方法?....在同一个评级表中也有不同种类的评级:“rating_quality” , "rating_sound"....等等...我也计划在未来为 "rating_user_credibilty"....等用户评分。
    • /** @ORM\Column(name="user_id",nullable=true) */ 会照顾用户不存在的问题。
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2012-03-11
    相关资源
    最近更新 更多