是否更好地为以下系统使用数据库轮询或事件?

时间:2010-09-28 00:17:12

标签: mysql

我正在开发一个与Netflix服务工作方式完全相同的订购系统(如果您不熟悉Netflix,请参阅此问题的结尾)。我有两种方法,我不确定哪种方法是正确的;一个依赖于数据库轮询,另一个是事件驱动。

以下两种方法假设这种简化的模式:

member(id, planId)
plan(id, moviesPerMonthLimit, moviesAtHomeLimit)
wishlist(memberId, movieId, rank, shippedOn, returnedOn)

轮询:我会在心愿单

中运行以下计数查询
  1. 计算已发送的电影此月份(其中发送的内容为NOT NOT NULL @memberId)
  2. 计算moviesAtHome(其中shippingOn IS NOT NULL,并返回IS为NULL @memberId)
  3. 计算moviesInList(@memberId)
  4. 以下功能将决定要发送的电影数量:

    moviesToShip = Min(moviesPerMonthLimit - shippedThisMonth, moviesAtHomeLimit - moviesAtHome, moviesInList)
    

    我会循环遍历每个成员,运行计数,并像在moviesToShip中一样遍历他们的列表。看起来像颈部疼痛,但它有效。

    事件驱动:此方法涉及添加额外的列“queuedForShipping”,并在每次事件发生时将其标记为0,1。我会做以下几点:

    1. 计算已发送的电影此月份(其中发送的内容为NOT NOT NULL @memberId)
    2. 计算moviesAtHome(其中shippingOn IS NOT NULL,并返回IS为NULL @memberId)
    3. 计算moviesQueuedForShipping(其中queuedForShipping = 1,@ memberId)
    4. 我必须使用以下if语句

      ,而不是使用min
      If moviesPerMonthLimit > (shippedThisMonth + moviesQueuedForShipping)
      AND IF moviesAtHomeLimit > (moviesAtHome + moviesQueuedForShipping))
      

      如果两个条件都为真,我将从wishlist中选择一行,其中queuedForShippinh = 0,并将它的queuedForShipping设置为1.每当有人添加,删除,重新排序列表时,我将运行此函数。什么时候发货,我会选择@memberId,其中queuedForShipping = 1.我也会在更新shippingAt和returnedAt时运行它。

      方法一很简单。它还允许成员混乱他们的队伍,直到某人决定进行投票。这样的方式总是由等级决定。但人们不断告诉民意调查是不好的。

      事件驱动的方法是自我维持的,但每次人们更改列表时,使用所有这些计数来ping数据库似乎是浪费时间。我还要写入列queuedForShipment。这也意味着当一个成员重新排名他们的列表并且他们有待处理的货物(shippingAt IS NULL,queuedForShipping = 1)时,我将不得不更新这些行并根据新的排名将queuedForShipping设置回1。 (如果有人添加了5部电影,然后突然改变命令怎么办?好吧,在他或她添加的前两部电影中,queuedForShipment已经设置为1)

      有人可以就这里的最佳方法以及民意调查与事件驱动的利弊相提并论吗?

      Netflix是一项月度订阅服务,您可以在其中创建电影列表,并根据您的服务计划限制向您发送电影。

1 个答案:

答案 0 :(得分:0)

根据您所描述的内容,当您需要(轮询)时可以非常轻松地创建数据时,没有理由保持数据“随时可用”(事件)。

缓存它的原因:

  1. 如果您需要向用户显示下一个项目。
  2. 如果由于某些保留政策而删除了详细数据。
  3. 如果轮询查询太慢。