如何在数据库中存储有顺序的数据
2011-10-23 21:19
661 查看
数据库中的记录都是按照集合的方式来组织的,一个记录集中的各个记录往往是无序的(或者有默认顺序,如按存入数据库的顺序,但不能绝对保证这种顺序)。如果在实际应用中,我们需要在数据库中存储类似于列表的有顺序的数据,此时该采取怎样的策略呢?
一种直接而有效的方法是,在记录集(或表)中增加一个“顺序”列(或叫“索引”字段),对表进行存入、取出或者排序的操作时,都可以依据“索引”字段来完成,从而保证数据应有的正确顺序:
这种方法的原理非常简单,而且也确实直接有效,这一点在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:
(2)在表中的A与B之间插入一个D,并设置对应的order字段为'aa',已有的A、B、C的order字段都可以保持不变:
这种方法是我在Store ordered list in database (Gap approach)上看到的,其中还提到了另一种称为"gap approach"的方法:在“顺序”列中设置有跨度的(不连续的)字段值(如100,200,300,...),从而为后面插入的记录预留可用的“顺序”字段值:
不管是“string approach”还是“gap approach”,随着插入记录的逐渐增多,一定程度后都会有一些限制。对于“string approach”而言,字符串可能变得过长;对于“gap approach”而言,预留的跨度区域总会用完。为了避免遇到这些限制,就需要我们定时地去整理表中的记录,对“顺序”字段重新进行统一编排规划,使得下一轮在表中插入新记录时,“顺序”字段的值也更简单有效,而不是冗长繁琐。
一种直接而有效的方法是,在记录集(或表)中增加一个“顺序”列(或叫“索引”字段),对表进行存入、取出或者排序的操作时,都可以依据“索引”字段来完成,从而保证数据应有的正确顺序:
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”而言,预留的跨度区域总会用完。为了避免遇到这些限制,就需要我们定时地去整理表中的记录,对“顺序”字段重新进行统一编排规划,使得下一轮在表中插入新记录时,“顺序”字段的值也更简单有效,而不是冗长繁琐。
相关文章推荐
- 关于UEditor插件的使用以及UEditor数据回显问题,数据库存储标签代码前台页面如何解析问题小结
- SQL Server存储引擎 - 01. 数据库如何读写数据
- 在Wince下如何实现数据存储到数据库中
- 文档型数据库设计模式-如何存储树形数据
- 数据存储之SQLite -- 如何查看数据库文件(基于AS开发工具)
- SQL Server存储引擎 - 01. 数据库如何读写数据
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
- 文档型数据库设计模式-如何存储树形数据
- . 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列,要求执行效率高,并说明如何改善执行效率(该函数必须自己实现,不能使用php函数)。
- 用JAVA如何实现每天1亿条记录的数据存储,数据库方面怎么设计?
- SqlServer存储引擎——01.数据库如何读写数据
- 如何把数据库中的数据存储在list中
- 文档型数据库设计模式-如何存储树形数据
- 希望大牛讨论 树状数据如何选择数据库和设计存储格式
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据 [转]
- 为什么HashMap取出的数据顺序和存储时的顺序不一致,如何解决?
- 深入理解开源数据库中间件 Vitess:核心特性以及如何进行数据存储的堆叠
- 如何设计一个数据库中间件(支持百亿级别数据存储)
- 深入理解开源数据库中间件 Vitess:核心特性以及如何进行数据存储的堆叠
- 如何将数据库中的数据存储成各种文件类型