大量的数据,页面表格实现排序,后台怎么处理,才能保证效率

        课题提出:表格中存在大量数据,至少有1000条数据,如果想要给此1000条数据中的其中一条移动位置,一个排序字段也可以满足此功能,但是如果改变了其中一条数据,那此条数据下面的数据都需要修改,这样修改的效率就很低,如何设计才能使数据移动排序效率高呢?

        我感觉最合理的方式就是用2个字段进行排序,能够效率的进行数据移动排序。

        理论:

1、使用两个字段orderNo和orderNoBk进行排序。

2、新增的时候,分三种,第一种是此表格没有数据,新增第一条数据时,2个字段的值都赋值1,第二种是此表格已经存在数据,选中其中一条数据,在此条之后增加数据,新增的数据的orderNo字段和选中的数据的orderNo相同,并且orderNoBk比选中的数据+1,其他的和选中数据的orderNo相同的数据的,并且orderNoBk比选中数据的大的数据,如果这种数据存在的话,orderNoBk字段+1进行更新,新增的数据做新增操作。第三种是未选中任何数据,新增数据,这时,只需要查询出数据库中此类数据的orderNo字段最大的值,并且此值+1,新数据做新增处理。

3、排序的时候,分两种,第一种是将一条数据移动到数据的首位,那么此数据修改为orderNo和orderNoBk都是1,并且把所有orderNo是1的数据的orderNoBk字段做+1处理,错做过的数据做更新,第二种是将一条数据移动到某条数据的后面,那么移动的数据的orderNo变更为某条数据的orderNo相同,orderNoBk变更为某条数据的+1,并且查询和某条数据的orderNo相同的数据并且orderNoBk比某条数据的大的数据+1,并且移动的数据和orderNoBk比某条数据的大的数据做更新处理

         新增代码如下:

    public Integer save(Model model) throws Exception {
        // orderNo = 1 是新增的第一条
        int orderNo = model.getOrderNo();
        if(orderNo == 1){
            model.setOrder_no(1);
            model.setOrder_no_bk(1);
            return // 执行新增操作
        }
        // 如果orderNo = 0   selectModelId 不等于空,是选中了某一条的后面造一条
        String selectModelId = model.getSelectModelId();
        if(StringUtils.isNotBlank(selectModelId)){
            // 查询出orderNo相同的数据,并且按照从小到大排序
            List<Model> models = xxxxxx查询相同orderNo的方法;
            Model selectModel = null;
            Iterator<Model> modelIterator = projectModels.iterator();
            Model element;
            while (modelIterator.hasNext()) {
                element = modelIterator.next();
                // 查询到呗选中的数据,赋值
                if(selectModelId.equals(element.getId())){
                    selectModel = element;
                }
                if(selectModel != null){
                		// orderNoBk大的留下
                    if(element.getOrderNoBk() > selectModel.getOrderNoBk()){
                        element.setOrderNoBk(element.getOrderNoBk()+1);
                        element.setUpdateTime(LocalDateTime.now());
                        element.setUpdateUser(Model.getUpdateUser());
                    }else{
                    		// orderNoBk 等于的删除
                        modelIterator.remove();
                    }
                }else{
                		// orderNoBk 小于的删除
                    modelIterator.remove();
                }
            }
            if(null != selectModel){
                model.setOrderNo(selectModel.getOrderOo());
                model.setOrderNoBk(selectModel.getOrderNoBk()+1);
            }
            // models 执行更新操作
            return // model 执行新增操作
        }
        // 如果orderNo = 0  selectModelId 不等于空,是没选中一条,在最后造一条,查询出最后一条
        Model lastOne = 查询出orderNo最大的那条数据
        model.setOrderNo(lastOne.getOrder_no()+1);
        model.setOrderNoBk(1);
        return // model 执行新增操作
    }

        排序的代码

    public void sort(List<Model> models, String userId) throws Exception{
        // 获取选中的数据
        Model selectModel = models.get(0);
        String type = selectModel.getType();
        // 如果集合中只有一个值,说明选中的数据被挪到了第一的位置,没有前一个数据
        if(1 == Models.size()){
            // 查询出orderNo=1的相同的数据数据
            List<Model> projectModels = xxxxxx查询相同orderNo=1的方法;
            // OrderNoBk 都+1
            models.forEach(any-> any.setOrderNoBk(any.getOrderNoBk()+1));
            // 选中的数据初始化 orderNo(1) 和 orderNoBk(1)
            selectModel.setOrderNo(1);
            selectModel.setOrderNoBk(1);
            models.add(selectModel);
            // models 更新操作
            return;
        }
        // 变换后,选中数据的前一个数据
        Model frontModel = models.get(1);
        String modelId = frontModel.getId();
        List<Model> pModels = xxxx查询出和选中数据相同orderNo的数据;
        Iterator<Model> modelIterator = pModels.iterator();
        Model element;
        while (modelIterator.hasNext()){
            element = modelIterator.next();
            if(element.getOrderNoBk() > frontModel.getOrderNoBk()){
                // orderNoBk > frontModel的 OrderNoBk的数据数据+1,并做更新
                element.setOrderNoBk(element.getOrderNoBk()+1);
            }else {
                // 删除掉 OrderNoBk <= frontModel的 OrderNoBk的数据数据
                modelIterator.remove();
            }
        }
        selectModel.setOrderNo(frontModel.getOrderNo());
        selectModel.setOrderNoBk(frontModel.getOrderNoBk()+1);
        pModels.add(selectModel);
        // pModels 做更新处理
    }

        上面即使我所说的2个字段在数据量大的时候排序方法,非常的高效,有小伙伴有这种需求,可以按照我这种方法实行,如果有看的不懂的地方,添加微信【xia-5618】进行沟通。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值