mysql的存取顺序_如何在数据库中存储有顺序的数据
数据库中的记录都是按照集合的⽅式来组织的,⼀个记录集中的各个记录往往是⽆序的(或者有默认顺序,如按存⼊数据库的顺序,但不能绝对保证这种顺序)。如果在实际应⽤中,我们需要在数据库中存储类似于列表的有顺序的数据,此时该采取怎样的策略呢?
⼀种直接⽽有效的⽅法是,在记录集(或表)中增加⼀个“顺序”列(或叫“索引”字段),对表进⾏存⼊、取出或者排序的操作时,都可以依据“索引”字段来完成,从⽽保证数据应有的正确顺序:
content order
css inset--------------------
A 1
B 2
C 3
使⽤上述⽅法的⼀个问题是,如果想要在已有的有序记录之间插⼊⼀个新的记录,就需要刷新所有“索引
”字段的值,即重新排序所有记录,以保证插⼊后的正确顺序,如果表中的记录很多,那么每插⼊⼀个记录时,就会带来巨⼤的重排消耗。
⼀种解决(或者是缓解)这种“重排消耗”的⽅法是:不采⽤简单的整数值(如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
--------------------
mysql语句顺序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
-
vlookup常见的12种错误------------------- --------------------
A 100 A 100
B 200 D 150 (new added)
C 300 B 200
C 300
不管是“string approach”还是“gap approach”,随着插⼊记录的逐渐增多,⼀定程度后都会有⼀些限制。对于“string approach”⽽⾔,字符串可能变得过长;对于“gap approach”⽽⾔,预留的跨度区域总会⽤完。为了避免遇到这些限制,就需要我们定时地去整理表中的记录,对“顺序”字段重新进⾏统⼀编排规划,使得下⼀轮在表中插⼊新记录时,“顺序”字段的值也更简单有效,⽽不是冗长繁琐。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论