Связанный список в SQL

Если вы используете реализацию DOM, у каждого из них есть встроенная встроенная форма:

# minidom
#
document.toprettyxml()

# 4DOM
#
xml.dom.ext.PrettyPrint(document, stream)

# pxdom (or other DOM Level 3 LS-compliant imp)
#
serializer.domConfig.setParameter('format-pretty-print', True)
serializer.writeToString(document)

Если вы используете что-то еще без своего собственного принтера - или эти симпатичные принтеры не совсем так делают, как вы хотите - вам, вероятно, придется писать или подклассифицировать собственный сериализатор.

58
задан 2 revsmagicrobotmonkey 16 September 2008 в 14:59
поделиться

7 ответов

Сохраните целочисленный столбец в своей таблице, названной 'положением'. Запишите 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); 
16
ответ дан Adrian Dunston 7 November 2019 в 15:36
поделиться

составьте таблицу с два сам ссылка на столбцы PreviousID и NextID. Если объект будет первой вещью в списке, то PreviousID будет пустым, если это будет последним, NextID будет пустым. 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
}
15
ответ дан lulalala 7 November 2019 в 15:36
поделиться

Используя решение Adrian, но вместо того, чтобы увеличить 1, инкремент 10 или даже 100. Тогда вставки могут быть вычислены в половине различия того, между чем Вы вставляете, не имея необходимость обновлять все ниже вставки. Выберите число, достаточно большое для обработки среднего количества вставок - если ее слишком маленькое тогда необходимо будет отступить к обновлению всех строк с более высоким положением во время вставки.

17
ответ дан cfeduke 7 November 2019 в 15:36
поделиться

Связанный список может быть сохранен с помощью рекурсивных указателей в таблице. Это - почти такие же иерархии, хранятся в Sql, и это использует рекурсивный шаблон ассоциации.

можно узнать больше о нем здесь .

я надеюсь, что это помогает.

4
ответ дан Ben Hull 7 November 2019 в 15:36
поделиться

Список может быть сохранен при наличии столбца, содержат смещение (индексное положение списка) - вставка в середине тогда увеличивает все выше нового родителя и затем делает вставку.

0
ответ дан Daniel Papasian 7 November 2019 в 15:36
поделиться

Самая простая опция составила бы таблицу со строкой на элемент списка, столбец для положения объекта и столбцы для других данных в объекте. Тогда можно использовать 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 в индексе 3:

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;

, Так как операции в списке могут потребовать нескольких команд (например, вставка потребует ВСТАВКИ и ОБНОВЛЕНИЯ), удостоверьтесь, чтобы Вы всегда выполнили команды в транзакции.

изменение А этой простой опции должно иметь постепенное увеличение положения некоторым фактором для каждого объекта, сказать 100, так, чтобы при выполнении ВСТАВКИ необходимо было не всегда перенумеровывать положение следующих элементов. Однако это требует немного большего усилия разработать, когда увеличить следующие элементы, таким образом, Вы теряете простоту, но получаете производительность, если у Вас будет много вставок.

В зависимости от Ваших требований другие опции могли бы обратиться, такие как:

  • , Если Вы хотите выполнить много манипуляций в списке и не многих извлечений, можно предпочесть иметь столбец ID, указывающий на следующий объект в списке, вместо того, чтобы использовать столбец положения. Тогда Вам нужно к повторяющейся логике в извлечении списка для приведения объектов в порядок. Это может быть относительно легко реализовано в сохраненном proc.

  • , Если у Вас есть много списков, быстрый способ сериализировать и десериализовать Ваш список к тексту/двоичному файлу, и Вы только когда-либо хотите сохранить и получить весь список, затем сохранить весь список как единственное значение в отдельном столбце. Вероятно, не, что Вы просите здесь все же.

4
ответ дан Rory 7 November 2019 в 15:36
поделиться

Существует несколько подходов, о которых я могу думать сразу же, каждый с отличающимися уровнями сложности и гибкости. Я предполагаю, что Ваша цель состоит в том, чтобы сохранить порядок в извлечении, вместо того, чтобы требовать устройства хранения данных как фактического связанного списка.

самый простой метод должен был бы присвоить порядковый номер каждой записи в таблице (например, 1, 2, 3...). Затем при получении записей определите порядок - на порядковом столбце для возвращения их в порядке.

Этот подход также позволяет Вам получать записи без учета на членство в списке, но допускает членство только в одном списке и может потребовать, чтобы дополнительный "идентификационный столбец" списка указал, которому списку принадлежит запись.

немного более тщательно продуманный, но также и более гибкий подход должен был бы хранить информацию о членстве в списке или списках в отдельной таблице. Таблице были бы нужны 3 столбца: идентификатор списка, порядковый номер и указатель внешнего ключа на запись данных. При этом подходе базовые данные ничего не знают о своем членстве в списках и могут легко быть включены в несколько списков.

1
ответ дан Mike Monette 7 November 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: