在数据库中实现排名字段的最佳方法是什么?

时间:2010-09-09 01:42:51

标签: mysql database-design

假设您有一个表格,用于存储人们的音乐喜好,并且您希望用户能够对其偏好进行排名。在插入时,应该自动计算等级字段。然而,稍后,用户应该能够编辑他的排名。

id, memberid, trackid, rank

编辑:看来最好的方法是找到成员现有排名的最大值并添加一个......

4 个答案:

答案 0 :(得分:2)

您的用户如何对曲目进行排名?他们会在一些用户界面中一个接一个地命令它们吗?

如果是这种情况,我建议将等级编号委托给客户端(接口)。因此,如果您有一个允许用户拖动和移动轨道以按顺序排列它们的界面,只需为它们分配顺序排名,当它们点击保存时,将此信息发送到数据库。


更新:

如果您希望新记录始终排在最后,那么您可以根据问题中的建议获得MAX(rank) WHERE memberid = ?,然后INSERT新行rank + 1。在transaction中包装所有内容将保证atomicity

答案 1 :(得分:2)

听起来你想在底部自动对新插入的项目进行排名。

INSERT INTO Prefs (MemberId, TrackId, Rank)
   SELECT   @MemberID, @TrackID,
            MAX(ISNULL(Rank,0))+1
   FROM Prefs
   WHERE MemberId = @MemberID

除了: 为什么不保持rank null,直到用户实际给每个项目一个排名值?向用户显示所有项目,当他们填写(或不填写!)排名时,然后为每个项目运行UPDATE语句。

答案 2 :(得分:1)

排名auto increment? 每次进行插入时,它都会增加该字段。喜欢id。

重读你的问题我认为我误解了它。您想要排名是自动的还是用户根据主题设置的字段?如果它是前者我不明白什么是错的。

答案 3 :(得分:0)

我认为你问的问题是“我怎么知道每个用户下一个等级应该是什么?”......但我不确定。

如果是这样,您可以简单地欺骗并在users表中为每个userID保留“max rank”字段。您在插入新排名之前查询该值,并为users表和排名表增加它。

或者,您可以使用“从memberid =?的排名中选择最大(排名)”类型查询让数据库为您计算它。不是最有效的,但对于类似iTunes的数据库,它可能是可管理的(也就是说,只要歌曲*用户的数量不是“太大”)。