使用单个数据库更新来度假项目

时间:2013-01-24 21:47:38

标签: algorithm sorting

假设您在Netflix上重新排序队列中的项目。对于我见过这种事情的每个例子,当你将最后一项移到顶部时,它会一次更新数据库中的每条记录。

1. One Fine Day              ==> change sort order from 1 to 2
2. Two and a Half Men        ==> change sort order from 2 to 3
3. Three Kings (move to top) ==> change sort order from 3 to 1

有更好的方法吗?也许只有在每次重新排序项目时才需要一次数据库更新?考虑一下:

1. One Fine Day              ==> do nothing (sort order stays at 1)
2. Two and a Half Men        ==> do nothing (sort order stays at 2)
3. Three Kings (move to top) ==> change sort order from 3 to 0

在另外两个项目之间移动项目会分割排序顺序之间的差异:

1. One Fine Day              ==> do nothing (sort order stays at 1)
2. Two and a Half Men        ==> do nothing (sort order stays at 2)
3. Three Kings (move to mid) ==> change sort order from 3 to 2.5

更进一步,我们可以使用比数字更大的字符集,也可以使用base64并按字母顺序排序,这样可以在重新排序所有项目以保持项目之间的工作空间之前为您提供无限制的度假。 / p>

无论如何,在诉诸时使用数据库的最明智的方法是什么?

1 个答案:

答案 0 :(得分:0)

根据我的理解,您的方案如下:

  1. 为了简单起见,我们假设我们有3个表MoviesUsersUserPreferenes(最后一个,列UserId,{{1 }和MovieId)。
  2. 每次用户更改自己喜欢的电影排序时,我们都应该更新Ordinal表格。
  3. 但通常需要更新UserPreferences至少2条记录(有一些例外,但我并没有缩小这些情况的整体逻辑)
  4. 所以,问题是:我们怎样才能避免多次更新而只更新一条记录呢?
  5. 如果上述内容正确无误,则解决方案解决方案为denormalization。没有一般的解决方案,并且在您选择的每个方向上存在警告的风险,我建议您应该考虑几种替代方案:

    1. 通过保留Ordinal列并将用户最喜欢的电影ID序列存储在另一列UserPreferences中,UserId中只有三列,但只有两列。{{1} }。

    2. 要将OrderedMovieIds列转换为有限数量的列,以指示用户的偏好设置:OrdinalOrdinal1,... Ordinal2 (当然这受到表格最大列数的限制)。