用户自定义排序功能的设计思路

需要做一个用户自定义排序的功能,本来并不觉得麻烦,但是做着做着发现,里面的问题很值得好好思考一下。

用户自定义排序的数据库设计很简单,无非是对需要排序的条加一个排序字段,但麻烦之处主要在于这个字段的更新过程。

如果用简单的1、2、3、4作为排序字段,那么把4移到1前面的情况下,原先的1~3都需要+1来为新的“1”腾出位置,这样会带来数倍于预期的计算量。

于是我希望找到一种方法来使得改变排序时候的计算量是常数,想来想去,找到一个不太优雅的思路:利用自然数不可数的特点(我真tm机智)。

具体来说就是用浮点数保存排序数据,当排序改变时,直接取该位置两边排序值的中间值,比如4需要排到第2位,那么就把4直接赋值为1.5,这时候3又要排到第3位,那么就把3设定为1.75,因为都是中值,数据也不算丑陋。

此外如果配上一个定时任务,每天晚上对数据进行规格化,这样基本上就是一个可持续的解决方案了。比如说刚才的排序数据已经变成:

1、1.5、1.75、2

我们把他们重新组织成蒸熟,把他们之间的距离拉开,这样就不会出现排序重复的问题了。

处理后可能会变成:

2、32、64、128

目前这个问题还远不是我的系统瓶颈,所以上面说的虽然是种解决方案,然而并没有什么卵用。

http://blog.csdn.net/gklifg/article/details/46226487

时间: 2024-10-08 18:31:04

用户自定义排序功能的设计思路的相关文章

角色与角色拥有哪些权限功能的设计思路理解

我们直接看图. 这只是一种设计方式,当然如果有更好的,可以自己去实现.

新增功能四则运算设计思路

1.避免重复:当产生新的式子时,可以和之前已经产生的式子中数字和运算符进行逐一匹配:2.可定制:输出多少式子可以定制,设置一个用户可以输入的变量:    因为要设定许多可控参数,可以把这些参数构成一个数组,也就是一个参数集,然后对每个参数分情况进行设定: 下面是每个可控参数: 1.是否有乘除法?用户可以选择,0是没有乘除法,1是有乘除法:2.有括号?0是没有括号,1是有括号:   括号是成对出现的,两边分别是运算符和数字,或者是数字和空:3.数值范围?可以设定随机函数产生的范围:4.加减可以有正

功能测试用例设计思路

1.输入框中输入最大允许值造成页面跳转溢出 2的32次幂 验证点:边界值.特殊字符.0.null.负值.超长字符.空字符串.英文字符.中文字符.全角符号 2.搜索框探索性测试: 探索性测试:"电 视"."电@视"."电#视".乱码->"电视".超长字符.空字符串.英文字符.其他字符.全角符号.""电视"" 3.json字符串 如果数据本身包含","."

数据库架构设计思路

一 .58同城数据库架构设计思路 (1)可用性设计 解决思路:复制+冗余 副作用:复制+冗余一定会引发一致性问题 保证"读"高可用的方法:复制从库,冗余数据,如下图  带来的问题:主从不一致 解决方案:见下文 保证"写"高可用的一般方法:双主模式,即复制主库(很多公司用单master,此时无法保证写的可用性),冗余数据,如下图  带来的问题:双主同步key冲突,引不一致 解决方案: a)方案一:由数据库或者业务层保证key在两个主上不冲突 b)方案二:见下文 58同

互联网数据库架构设计思路

一 .58同城数据库架构设计思路 (1)可用性设计 解决思路:复制+冗余 副作用:复制+冗余一定会引发一致性问题 保证"读"高可用的方法:复制从库,冗余数据,如下图   带来的问题:主从不一致 解决方案:见下文 保证"写"高可用的一般方法:双主模式,即复制主库(很多公司用单master,此时无法保证写的可用性),冗余数据,如下图   带来的问题:双主同步key冲突,引不一致 解决方案: a)方案一:由数据库或者业务层保证key在两个主上不冲突 b)方案二:见下文 5

Backbone设计思路和关键源码分析

一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开发思路奠定了夯实的基础,后来的react,vue无不是在backbone的影响下开创出来的经典模式.为什么这么说呢?我们先来回顾下Web前端开发的大概演变流程,本过程纯粹个人理解,抛砖引玉,共同探讨,如有偏差请看官指出错误: 1. 无前端:最早的网页就是HTML,还只是静态页面,当时的脚本含量极少甚

[三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

Stream的概念定义   官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.stream  一节部分原文内容的翻译 int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); 流操作被划分为中间和终端操作,并组合成流管道. 一条Stream管道由

流程管理中WEB表单开发服务需求分析及设计思路

在流程管理应用中,BPM产品所提供的表单设计工具,主要是面向开发人员的.而一些办公系统产品所提供的表单设计工具,受自身平台限制,无法在大型定制化应用中使用.在此通过对用户需求分析,提出WEB表单开发服务设计思路. 一.需求分析 现如今,在创新与改革社会环境推动下,办公管理系统的管理需求变化已经是常态了,如何让信息系统快速响应支撑管理需求的多变,已经成为使信息化建设和运维人员头痛的事情.特别是在一些大型企事业单位,快速支撑需求更突出.而原有信息系统很难适应这样的需求,必须走创新的路来解决这些需求,

用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. (1)流程中审批单 流程中审批单由功能按钮区.特殊功能区.业务表单区.附件区.审批意见区等区域构成,其中,业务表单区理论上包含附件和意见,但是由于附件和意见的业务特殊性,需要单独进行管理,剩下的业务表单就可以看作文档了. 在一些流程审批业务中,业务信息有的是以Excel或word文件等方式专递,这样