SQL中的链表
什么是将链接列表存储在mysql数据库中的最佳方法,以便插入操作很简单(即我们不必每次都重新索引一堆东西)并且可以轻松地按顺序取出列表。
解决方案
回答
可以通过使列包含偏移量(列表索引位置)来存储列表-在中间插入,然后在新的父对象上方递增所有内容,然后进行插入。
回答
在表中存储一个称为" 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);
回答
使用Adrian的解决方案,而不是增加1,而不是增加10,甚至是100。然后,可以按插入之间的差值的一半来计算插入,而不必更新插入下面的所有内容。选择一个足够大的数字来处理平均插入次数(如果它太小),那么我们将不得不依靠插入来更新所有位置较高的行。
回答
可以使用表中的递归指针来存储链表。这与Sql中存储的层次结构几乎相同,并且使用的是递归关联模式。
我们可以在此处了解更多信息。
我希望这有帮助。
回答
创建具有两个自引用列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 }
回答
最简单的选择是创建一个表,其中每个列表项有一行,项目位置的列,以及该项目中其他数据的列。然后,我们可以在位置列上使用ORDER BY以所需的顺序进行检索。
create table linked_list ( list_id integer not null , position integer not null , data varchar(100) not null ); alter table linked_list add primary key ( list_id, position );
要操作列表,只需更新位置,然后根据需要插入/删除记录。因此,要在索引1的列表1中插入项目:
begin transaction; update linked_list set position = position + 1 where position >= 3 and list_id = 1; insert into linked_list (list_id, position, data) values (1, 3, "some data"); commit;
由于列表上的操作可能需要多个命令(例如,插入操作将需要INSERT和UPDATE),因此请确保始终在事务内执行命令。
这个简单选项的一种变体是使每个项目的位置增加一定的比例,例如100,这样,当我们执行INSERT时,我们不必总是重新编号以下元素的位置。但是,这需要花费更多的精力才能确定何时增加以下元素,因此,如果我们要插入很多插入元素,则会失去简单性,但会获得性能。
根据要求,其他选项可能很有吸引力,例如:
- 如果要在列表上执行很多操作,而又没有很多检索操作,则最好使用一个ID列指向列表中的下一个项目,而不要使用position列。然后,我们需要在列表的检索中使用迭代逻辑,以便按顺序获得项目。这可以在存储的过程中相对容易地实现。
- 如果我们有很多列表,则可以使用一种快速的方法来将列表序列化和反序列化为文本/二进制,并且只想存储和检索整个列表,然后将整个列表作为单个值存储在单个列中。可能不是我们在这里要的。
回答
我可以想到几种方法,每种方法具有不同的复杂性和灵活性。我假设目标是保留检索顺序,而不是要求将其存储为实际的链接列表。
最简单的方法是为表格中的每个记录分配序数值(例如1、2、3,...)。然后,当我们检索记录时,在顺序列上指定一个排序依据以使它们按顺序恢复。
这种方法还允许我们检索记录而无需考虑列表中的成员身份,但是只允许一个列表中的成员身份,并且可能需要添加的"列表ID"列以指示记录属于哪个列表。
一种稍微复杂但又更灵活的方法是将有关成员资格的信息存储在一个或者多个列表中的单独表中。该表将需要3列:列表ID,序数值和指向数据记录的外键指针。在这种方法下,基础数据对其列表中的成员身份一无所知,并且可以轻松地将其包含在多个列表中。