zoukankan      html  css  js  c++  java
  • 如何在数据库中存储有顺序的数据

          数据库中的记录都是按照集合的方式来组织的,一个记录集中的各个记录往往是无序的(或者有默认顺序,如按存入数据库的顺序,但不能绝对保证这种顺序)。如果在实际应用中,我们需要在数据库中存储类似于列表的有顺序的数据,此时该采取怎样的策略呢?

          一种直接而有效的方法是,在记录集(或表)中增加一个“顺序”列(或叫“索引”字段),对表进行存入、取出或者排序的操作时,都可以依据“索引”字段来完成,从而保证数据应有的正确顺序:

            content     order
            -------------------- 
               A         1 
               B         2 
               C         3 
    

          这种方法的原理非常简单,而且也确实直接有效,这一点在Best way to save a ordered List to the Database while keeping the ordering中得到了大家的认可。

          使用上述方法的一个问题是,如果想要在已有的有序记录之间插入一个新的记录,就需要刷新所有“索引”字段的值,即重新排序所有记录,以保证插入后的正确顺序,如果表中的记录很多,那么每插入一个记录时,就会带来巨大的重排消耗。

          一种解决(或者是缓解)这种“重排消耗”的方法是:不采用简单的整数值(如0,1,2,3,...)作为“索引”字段,而是采用类似于('a','aa','ab',...,'b','ba','bb',...,'c',...)的字符串。

          该方法(我姑且称之为“string approach”)的原理举例如下:

          (1)假设表中已存在依次按照'a'、'b'、'c'的顺序存入的数据A、B、C:

            content     order
            -------------------- 
               A         'a' 
               B         'b' 
               C         'c' 
    

          (2)在表中的A与B之间插入一个D,并设置对应的order字段为'aa',已有的A、B、C的order字段都可以保持不变:

            content     order
            -------------------- 
               A         'a' 
               D         'aa'     (new added)
               B         'b' 
               C         'c' 
    

          这种方法是我在Store ordered list in database (Gap approach)上看到的,其中还提到了另一种称为"gap approach"的方法:在“顺序”列中设置有跨度的(不连续的)字段值(如100,200,300,...),从而为后面插入的记录预留可用的“顺序”字段值:

            content     order          content     order
            --------------------       -------------------- 
               A         100              A         100 
               B         200              D         150 (new added)
               C         300              B         200 
                                          C         300 
    

          不管是“string approach”还是“gap approach”,随着插入记录的逐渐增多,一定程度后都会有一些限制。对于“string approach”而言,字符串可能变得过长;对于“gap approach”而言,预留的跨度区域总会用完。为了避免遇到这些限制,就需要我们定时地去整理表中的记录,对“顺序”字段重新进行统一编排规划,使得下一轮在表中插入新记录时,“顺序”字段的值也更简单有效,而不是冗长繁琐。

  • 相关阅读:
    基于xmpp openfire smack开发之Android客户端开发[3]
    简单工厂,抽象工厂,工厂模式三者的对照
    【独具慧眼 推荐有礼】找出您心中的技术大牛 活动開始啦!
    ZOJ 3201
    具体解释站点沙盒期的原因表现与解决的方法
    工作,究竟意味着什么
    MVC之查询demo
    学习开淘宝网店
    快排的两种写法
    QTableWidget具体解释(样式、右键菜单、表头塌陷、多选等) (非代理)
  • 原文地址:https://www.cnblogs.com/russellluo/p/2222008.html
Copyright © 2011-2022 走看看