我想实现类似的东西,但我遇到了一些问题。我想知道我的选择是什么来解决这个问题,以及在这种情况下使用的常用技术是什么。 (如果您不熟悉Netflix,请参阅此问题的底部)
当前方法 创建一个“控件”表,其中包含有关客户状态的信息,并将其交叉引用到服务计划表。
controls(member_id, movies_rented_this_month, movies_at_home)
plans(movies_per_month_limit, movies_at_home_limit)
退回商品时,请检查控制表以查看客户是否有资格接收其他订单。
if controls.movies_at_home < plan.movies_at_home_limit
and if controls.movies_this_month < plan.movies_this_month_limit
对于之前没有订单(新客户)或在关闭订单时在电影队列中没有任何内容的任何人,我们创建一个预定事件来创建订单(轮询)。
问题我们需要考虑每个客户根据其计划可以拥有的订单数量。上述逻辑在某些情况下失败:
plans.movies_this_month_limit = 4, controls.movies_this_month = 3
plans.movies_at_home_limit = 2 , controls.movies_at_home = 0
在上述方案中,符合一个订单的客户将获得两个订单。扭转标准可以解决问题。
简化架构
members(id, plan_id)
movies(id, title)
plans(id, movies_at_home_limit, movies_per_month_limit)
controls(member_id, movies_at_home, movies_this_month)
movie_queue(member_id, movies_id)
Netflix的 一种在线电影租赁服务,允许会员保留电影愿望清单。客户根据他们的计划类型从他们的愿望清单(通过邮件)逐步接收电影。
答案 0 :(得分:1)
我怀疑它没有使用CONTROLS表,而是检查其内部发货/接收历史记录,以确定在确定是否向客户发送电影时,任何客户拥有的电影数量。
鉴于运送/接收历史记录表中单个客户ID的高选择性,探测(MEMBER_ID, SHIP_DATE, DISC_ID)
和(MEMBER_ID, RECEIVED_DATE, DISC_ID)
上的假设索引以回答CONTROLS表寻求的问题并不昂贵。
CONTROLS
不是一张桌子;它是一个视图/标量子查询。给定一个成员ID和一个日期,并假设SHIPPED_DISK和RECEIVED_DISK为了清晰起见是单独的表:
movies_rented_this_month = (SELECT COUNT(*) FROM SHIPPED_DISC
WHERE MEMBER_ID = :member_id
AND SHIP_DATE >= FIRST_DAY_OF_MONTH (:date)
AND SHIP_DATE < FIRST_DAY_OF_MONTH (:date) + 1 month)
movies_at_home = (SELECT COUNT(*) FROM SHIPPED_DISC shp
WHERE MEMBER_ID = :member_id
AND NOT EXISTS (SELECT NULL FROM RECEIVED_DISC rcv
WHERE shp.member_id = rcv.member_id
AND shp.disc_id = rcv.disc_id)
或者
(SELECT ship_count - receive_count
FROM (SELECT COUNT(*) ship_count FROM SHIPPED_DISC shp
WHERE MEMBER_ID = :member_id
UNION ALL
SELECT COUNT(*) receive_count FROM RECEIVED_DISC rcv
WHERE MEMBER_ID = :member_id) dummy
)
或者,您可以维护一个MEMBER_HAS_DISC表(再次,我假设光盘,但是使用Netflix,也有流媒体,因此可能需要抽象到MEMBER_HAS_PRODUCT),其中发送/接收日志插入到从该表中删除,这将非常容易检查。我认为了解客户所拥有的东西比他们使用过多少代币更有用。