如我有商品
MaterialCode Name CreateTime SortNumber
1            A    2010-1-1   0
2            B    2010-1-2   2
3            C    2010-1-3   1
4            D    2010-1-4   3
--------------------------------------
因为商品的显示前后是要可以自定义的,所以加多了一列SortNumber来处理一开始我就加多了SortNumber记管理员输入当前商品的排序号
但要是商品多了以后就会出现如
0
1
1
1
2
2
4
因为管理员没有办法很好的维护这些数据然后我只能写存储过程当更新一条数据的时候,
根据一定规则去更新所有商品现有排序号和新的排序号不同的记录
这样可以很好的体现出排序
但是当一个表有10+W或100+W条记录的话用这种方法不是很没有效率求:
大家是怎么设计的谢谢

解决方案 »

  1.   

    这个SortNumber可以考虑用identity自增,当要连续的序号时,查询的时候通过对自增列进行排序,使用row_number
      

  2.   

    你的SortNumber可以一开始不是连续的,比如都是隔5个,这样在新增时可以灵活调整 ,
      

  3.   

    确实是个问题,
    如果对新增的/修改的 排序方式操作不多的话,可以采用预留的方式,如2#我的做法会是,多增加栏位来定义商品,比如增加对商品的 大类,小类等等属性定义,这样处理起来影响的数据就相应少很多。
    实际中,我有一个表也有类似的需求(当然数据不多)
    我的定义是 varchar(21)
    每3位代表一个属性,如下数据,这样我改动或者新增一笔数据,影响的资料,相对少很多(最多99條)
    001002003004005005001
    001002003004005005002
    001002003004005006001
    001002003004005006002
      

  4.   

    这个SortNumber可以考虑用identity自增,当要连续的序号时,查询的时候通过对自增列进行排序,使用row_number
    ----------------------
    RE:我是不定的,我能会让一条记录排在第1也可能是1000也可能是10000你的SortNumber可以一开始不是连续的,比如都是隔5个,这样在新增时可以灵活调整 
    在前台传参数到后台里去,比如看前20名,或前30名的排序就可以了,这样就避免有100W记录的效率问题
    -----------------------
    RE:我是要对全部的数据进行分页排序所以对前20,30排是不行的谢谢
      

  5.   

    我做的是 
    直接在后台写个方法直接对编号进行排序的
    -----------
    我现在就是这样,但每修改一条记录,或添加一条记录都要进行排序确认
    有100W条数据的话操作量太大我的定义是 varchar(21) 
    每3位代表一个属性,如下数据,这样我改动或者新增一笔数据,影响的资料,相对少很多(最多99條)
    ----------------------
    我怎么看不懂啊。如果按你的这样就是说添加多一个表来对他的1对1的记录,在这里保存排序号
    更新的时候更新这里而不用去更新主表,固然这样对记录操作一样多,但数据量较小
    但有个问题就是查询的时候要两个表进行Inner Join
      

  6.   


    我只是举自己的例子给你参考,简单来说,假如你有 10 的数据量,预设未来影响的数据量也在 10左右
    name   sort
    A      1
    B      2
    C      3
    D      4
    E      5
    ..
    J      10现在需要插入 K = 5, 这样将会影响 E~J 供6条记录(sort=sort+1)==============华丽的分页================
    如果将sort定义成 
    name   sort
    A      0101
    B      0201
    C      0301
    D      0401
    E      0501
    ..       
    J      1001这时,再插入 K=5 ,只需直接插入  K = 0501 ,然后只需 set E=0502 ,即可。(影响1条记录)
    或者直接插入 K=0410即可。说穿了,也是预留方法的一种变通。 可以讲 4码的sort 拆成2个栏位。 影响的资料笔数与栏位数 成指数反比。
      

  7.   

    如果说一开始就保证了SortNumber不重复,比如说insert一条记录的时候,SortNumber的值取当前的SortNumber的最大值加1,那就好办了。在管理员修改某个商品占第几位的时候,只需要修改2条记录。比如说从第10位改变到第3位,查出这2条记录对应的主键和SortNumber ,然后互换一下就可以了。
    至于你现在已经有很多重复的了,建议这样,在给管理员显示的时候,那个第几位不要显示数据库中的SortNumber 字段值,而显示你排序后的顺序值,比如说第一位就是1,第二位就2.当管理员修改某个商品的位置的时候,比如把第十位调整到第三位的时候,你要做的就是把当前第一位和第二位的SortNumber 值+2,当前第十位的SortNumber 值=当前第三位的值+1.这样影响的记录数也少。最坏的结果是把一个商品从第一位移到第n位,修改的记录数是n。