0

假设您正在 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 并按字母顺序排序,这将使您在必须重新排序所有项目以保持项目之间的工作空间之前几乎可以无限使用。

无论如何,在求助时打你的数据库的最聪明的方法是什么?

4

1 回答 1

0

据我了解,您的情况如下:

  1. 为简单起见,让我们假设我们有 3 个表Movies,UsersUserPreferenes(最后一个,带有列UserId,MovieIdOrdinal)。
  2. 每次用户改变他对他最喜欢的电影排序的偏好时,我们都应该更新UserPreferences表格。
  3. 但这通常需要更新至少 2 条记录Ordinal的列(有一些例外,但我不会将整体逻辑缩小到这些情况)
  4. 那么问题来了:我们如何才能避免多次更新而只更新一条记录呢?

如果上述情况正确,则解决方法是denormalization。没有通用的解决方案,并且您选择的每个方向都有警告的风险,我建议您应该考虑以下几种替代方案:

  1. 要在 中没有三列,而只有两列UserPreferences,通过保留该UserId列并将用户最喜欢的电影 ID 的序列存储在另一列中,OrderedMovieIds.

  2. 要将Ordinal列转换为表示用户偏好的有限列数:Ordinal1, Ordinal2, ... OrdinalN(当然这受表最大列数的限制)。

于 2013-01-24T22:23:19.047 回答