对数据库中的一组记录进行排序?
假设PHP / MYSQL,但我不一定需要实际的代码,我只是对它背后的理论感兴趣。
一个很好的用例就是Facebook的照片库页面。 您可以在页面上拖放照片,该照片触发Ajax事件以保存新的排序顺序。 我正在执行一些非常相似的事情
例如,我有一个包含大约一百万条记录的数据库表“照片”:
照片 id:int,userid:int,albumid:int,sortorder:int,文件名:varchar,title:varchar
假设我有一张拥有100张照片的专辑。 我将照片拖放到新的位置,并且Ajax事件触发以保存在服务器上。
我应该将整个照片ID传回服务器并更新每条记录吗? 假设通过“ WHERE userid
= loggedin_id
”进行输入验证,因此恶意用户只能混淆他们自己照片的排序顺序
我是否应该传递照片ID,其先前的排序顺序索引及其新的排序顺序索引,检索这两个索引之间的所有记录,对它们进行排序,然后更新它们的订单?
如果单个图库中有数千张照片并且排序顺序发生更改,会发生什么情况?
那么只需使用定义顺序的integer
列呢? 默认情况下,您分配数字* 1000,如1000,2000,3000 ....如果您在1000和2000之间移动3000,则将其更改为1500.因此,在大多数情况下,您不需要更新其他数字。 我使用这种方法,它运作良好。 你也可以使用double
但是你不能控制精度和舍入误差,所以不要使用它。
所以算法看起来像 :假设你将B移动到A之后的位置。首先执行select来查看A旁边记录的顺序。如果它至少比A的顺序高出+2,那么你只需设置B的顺序以适应之间。 但是,如果它高出+1(A之后没有空格),则选择B的边界记录以查看该边有多少空间,除以2,然后将该值添加到A之间的所有记录的顺序和B.就是这样!
(请注意,对于包含多个查询的算法,您应该使用事务/锁定,所以这也适用于这种情况。最简单的方法是使用InnoDB事务。)
作为链接列表存储,sortorder是集合中下一个photo_id的外键引用。
这可能是一个'链接列表'结构。
链接地址: http://www.djcxy.com/p/64021.html