当前位置:  开发笔记 > 后端 > 正文

SQL中的链接列表

如何解决《SQL中的链接列表》经验,为你挑选了3个好方法。

什么是在mysql数据库中存储链表的最佳方法,这样插入很简单(即你不必每次都重新索引一堆东西),这样就可以很容易地按顺序拉出列表了.



1> cfeduke..:

使用Adrian的解决方案,但不是递增1,而是递增10或甚至100.然后插入可以计算在插入之间的差异的一半,而不必更新插入下面的所有内容.选择一个足够大的数字来处理平均插入次数 - 如果它太小,那么你将不得不回退到更新插入期间更高位置的所有行.


让我想起我的编程BASIC的日子,当行号是10的倍数时.

2> Adrian Dunst..:

在表中存储一个名为"position"的整数列.为列表中的第一项记录0,为第二项记录1,等等.索引数据库中的该列,以及何时将值拉出,按该列排序.

 alter table linked_list add column position integer not null default 0;
 alter table linked_list add index position_index (position);
 select * from linked_list order by position;

要在索引3处插入值,请修改第3行及以上的位置,然后插入:

 update linked_list set position = position + 1 where position >= 3;
 insert into linked_list (my_value, position) values ("new value", 3); 


这不符合每次插入时不必重新索引一堆东西的要求.如果你有一个大表并在开头插入,你将不得不触摸每个记录,以便修改它的位置字段.
@ user898617浮点的有限精度限制了可以在两点之间插入的次数:(1-2)变为(1-1.5)变为(1-1.25)变为(1-1.125)变为(1-1.0625). ..直到你用完了尾数,再也无法区分分歧了.
我们可以为此使用浮点值而不是整数吗?然后插入可以采用十进制值,而无需增加其他记录。
@masterxilo我按照我描述的方式制作了一个库:https://github.com/fasiha/mudderjs#readme,尽管您是对的,但该方案无法优化事后删除。

3> 小智..:

创建一个包含两个自引用列PreviousID和NextID的表.如果该项是列表中的第一项,则PreviousID将为null,如果它是最后一项,则NextID将为null.SQL看起来像这样:

create table tblDummy
{
     PKColumn     int     not null, 
     PreviousID     int     null, 
     DataColumn1     varchar(50)     not null, 
     DataColumn2     varchar(50)     not null,  
     DataColumn3     varchar(50)     not null, 
     DataColumn4     varchar(50)     not null, 
     DataColumn5     varchar(50)     not null, 
     DataColumn6     varchar(50)     not null, 
     DataColumn7     varchar(50)     not null, 
     NextID     int     null
}


这是我在解决方案中的第一次破解,然而,它不能满足"按顺序拉出"的要求.我们的解决方案是最像*链接列表,但更难以按顺序检索.
我认为没有神奇的解决方案,既不需要更新所有索引,也很容易订购.这实际上取决于您最常操作数据库的方式.大多数更改是中间链接列表还是大多数数据都会附加到末尾.
为什么同时具有`PreviousID`和`NextID`?只有其中一个,你可以推断另一个:`foo.previous_id = bar_id` =>`bar.next_id = foo_id`.
PreviousID不是多余的,它可以用于在列表中进行快速revsere遍历,而无需执行更多SQL来获取它.是的,你可以没有,但我个人更喜欢这个解决方案.在一天结束时,它归结为您将如何访问您的数据.
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有