Database design Netflix使用何种逻辑创建客户订单?

Database design Netflix使用何种逻辑创建客户订单?,database-design,Database Design,我想实现类似的东西,但我遇到了一些问题。我想知道解决这个问题的方法是什么,以及在这个场景中使用的常用技术是什么。(如果您不熟悉Netflix,请参阅此问题的底部) 当前方法 创建包含客户状态信息的“控制”表,并将其交叉引用到服务计划表 controls(member_id, movies_rented_this_month, movies_at_home) plans(movies_per_month_limit, movies_at_home_limit) 退货时,检查控制表,查看客户是否有

我想实现类似的东西,但我遇到了一些问题。我想知道解决这个问题的方法是什么,以及在这个场景中使用的常用技术是什么。(如果您不熟悉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
在上述场景中,符合一个订单条件的客户将收到两个订单。颠倒标准会颠倒问题

简化模式

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
在线电影租赁服务,允许会员保留电影的愿望列表。客户根据他们的计划类型,从他们的愿望列表(通过邮件)中以增量方式接收电影。

我怀疑它没有使用控制表,而是检查其内部发货/接收历史记录,以便在确定是否向客户发货电影时,动态确定任何客户拥有多少电影

考虑到装运/接收历史记录表中单个客户ID的高选择性,探索
(成员ID、装运日期、光盘ID)
(成员ID、接收日期、光盘ID)
上的假设索引来回答控制表寻求的问题并不昂贵


控件
不是表;这是一个视图/标量子查询。给定一个成员ID和一个日期,并假设发货盘和接收盘是单独的表,以便于说明:

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)

或者,您可以维护一个MEMBER_HAS_DISC表(我假设是discs,但Netflix也有流媒体,因此可能需要将其抽象为MEMBER_HAS_产品),其中装运/接收日志插入该表并从中删除,这将非常容易检查。我认为了解客户拥有什么比了解他们使用了多少代币更有用。

>这意味着我们了解封闭系统。我添加了一个简短的说明,说明什么是Netflix,我的模式是什么。对不起,有一件事让我措手不及。亚当,你是说收发货表可以处理生成订单的逻辑,而不是使用控件的表?你能给我一个简单的例子,说明它是如何工作的吗?我不是指代码,而是对所涉及的逻辑的概述…谢谢Adam。我明白了。但是,如果我们在发货表中添加一个shipping\u returned\u on列,并避免同时使用一个returns表,这不是更简单吗。这取决于数据量。我可以说,在Oracle和DB2中,更新表比插入记录要昂贵得多。如果它们是独立的事件,也许它们应该这样建模。
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
        )