假设您在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>
无论如何,在诉诸时使用数据库的最明智的方法是什么?
答案 0 :(得分:0)
根据我的理解,您的方案如下:
Movies
,Users
和UserPreferenes
(最后一个,列UserId
,{{1 }和MovieId
)。Ordinal
表格。UserPreferences
列至少2条记录(有一些例外,但我并没有缩小这些情况的整体逻辑)如果上述内容正确无误,则解决方案解决方案为denormalization。没有一般的解决方案,并且在您选择的每个方向上存在警告的风险,我建议您应该考虑几种替代方案:
通过保留Ordinal
列并将用户最喜欢的电影ID序列存储在另一列UserPreferences
中,UserId
中只有三列,但只有两列。{{1} }。
要将OrderedMovieIds
列转换为有限数量的列,以指示用户的偏好设置:Ordinal
,Ordinal1
,... Ordinal2
(当然这受到表格最大列数的限制)。