想象一个电影应用程序,根据以下非常简单的算法向用户推荐下一部电影:
- 电影应该是用户新看到的
- 用户没有将电影标记为“不感兴趣”
这是 SQL Server 数据库的简单设计:
Movies:
Id bigint
Name nvarchar(100)
SeenMovies:
Id bigint
UserId bigint
MovieId bigint
NotInterestedFlags:
Id bigint
UserId bigint
MovieId bigint
为了获取下一部电影,我们运行以下查询:
select top 1 *
from Movies
where Id not in
(
select MovieId
from SeenMovies
where UserId = 89283
)
and Id not in
(
select MovieId
from NotInterestedFlags
where UserId = 89283
)
随着应用程序的使用和数据量的增加,这个设计变得越来越慢。
因此,对于一个拥有100K部电影和超过1000万客户的虚构数据库,如何改变这个设计以使其水平扩展呢?