插入(如插入item的Id,前一个preItem的id) 第一步:找出前一个item的orderNum,select orderNum where id = preItem.id,没有则默认为0 第二步:找出前一个item的后一个item的orderNum,select orderNum from task where orderNum > preItem.orderNum order by orderNum asc limit 1 第三步:新插入item的orderNum = (suffixItem.orderNum - preffixItem.orderNum) / 2,在保留x位小数。具体数据库是用double还是varchar存储,这个笔者还没研究哪个效率比较高。
删除(要删除的itemId) 直接删除item,不需要挪动任何其他的item
上移/下移(要上移的itemId) 第一步:找到要上移item的orderNum 第二步:找出要上移item的前一个item的orderNum,select orderNum from task where orderNum < item.orderNum order by orderNum asc limit 1 第三步:如果前一个oderNum不存在,则表示当前item在最上了,无法移动 第四步:否则将这两个item交换orderNum,保存 第五步:可以在开启一个定时器,定时整理orderNum的值
总结:改良实现思路的好处是解决了两个问题 1.通过where order > xxx limit 1来找出前一个或后一个,而不是通过order+1或order-1来找出前一个或后一个,可以降低对数据的要求,不要求order必须是连续递增+1的。 2.正因为对数据的要求降低了,所以删除和插入不需要维护其他item的orderNum了,所以也就加快删除和插入的效率了!