代码之家  ›  专栏  ›  技术社区  ›  halocursed

MySQL数据库设计?

  •  1
  • halocursed  · 技术社区  · 16 年前

    我有一个表,其中存储每个产品的用户评级。 该表由以下字段组成 productID、userID、分级(共5个) …此表将来可能包含一百万行….
    因此,为了选择前5种产品,我使用以下查询::。

    SELECT productid, avg( rating ) as avg_rating
    from product_ratingstblx245v
    GROUP BY productid
    ORDER BY avg( rating ) DESC
    LIMIT 5
    

    我的问题是,因为我将在我的网站的几页上显示这个结果,是否最好保留一个单独的表,用于字段的平均评分? productID、avgrating、totalvotes ????

    3 回复  |  直到 16 年前
        1
  •  1
  •   Jaimal Chohan    16 年前

    tbh,如果MySQL不能以(低于)毫秒的速度处理超过一百万条记录的简单表模式(如您的表模式)上的查询,我真想知道为什么公司会将它用于LOB应用程序。

    事实上,我是一个MS SQL开发人员,所以我对MySQL的能力知之甚少。但是,假设它的数据库引擎和SQL服务器一样好(我听说过关于我的SQL的一些好消息),您不需要担心性能问题。如果您想调整它,那么为什么不在应用程序层缓存结果10分钟(或更长时间)?触发器通常是纯粹的(尽管有时是必要的)邪恶。SQL服务器专门为您要执行的查询类型而设计,信任SQL。

        2
  •  3
  •   pvoosten    16 年前

    你还不需要那个问题的答案。您可以从一个视图开始,这是执行上述查询的结果。如果在执行负载测试(例如使用jmeter)之后,您发现您的站点确实运行缓慢,那么您可以用一个临时表(存储在内存中)替换视图。由于视图和临时表从外部看是相同的,所以您不必更改业务逻辑。

        3
  •  1
  •   Joe Phillips    16 年前

    就我个人而言,我不喜欢这样计算总数的想法,但是如果有必要的话,我不会存储平均值,我会存储总投票数和总评分。这样,这是一个非常简单的更新查询(将1添加到总投票数,并将评级添加到总评级)。然后您可以在最短时间内计算飞行中的平均值。

    至于你如何处理这个问题,我会使用一个已经有人建议的触发器。但只有在尝试了别人建议的观点之后。