Учитывая, что у вас есть несколько связанных списков, хранящихся в одной и той же таблице, я предполагаю, что вы храните либо HEAD, либо / или TAIL тех, которые находятся в некоторых других таблицах. Несколько идей:
1) Сохранить связанный список:
Первым большим улучшением (также предложенным в комментариях) с точки зрения запроса данных было бы наличие некоторого общего идентификатора (давайте назовем его ListID
) всех узлов в одном списке. Здесь есть несколько вариантов:
- Если на каждый список ссылаются только из одного объекта (строки данных) [я бы даже сформулировал вопрос как «Список принадлежит одному объекту?], Тогда это
ListID
может быть просто (основным) идентификатором объекта-держателя с ForeignKey
сверху для обеспечения целостности данных.
В этом случае запрос всего списка очень прост. Фактически, вы можете определить relationship
и перемещаться по нему как my_object.my_list_items
.
- Если список используется / на него ссылаются несколько объектов, то можно создать другую таблицу, которая будет состоять только из одного столбца
ListID (PK)
, и каждый узел / элемент снова будет иметь ForeignKey или что-то подобное
- Иначе, большие списки могут быть загружены в двух запросах / инструкциях SQL:
- запросить ГОЛОВУ / ХВОСТ по его идентификатору
- запросить весь список на основе полученных
ListID
ГОЛОВНОЙ / ХВОСТНОЙ
Фактически, это можно сделать с помощью одного запроса, подобного приведенному ниже ( Пример с одним запросом ), который более эффективен с точки зрения ввода-вывода, но выполнение его в два этапа имеет то преимущество, что вы сразу получаете ссылка на узел HEAD (или TAIL).
Пример одного запроса:
# single-query using join (not tested)
Head = alias(Node)
qry = session.query(Node).join(Head, Node.ListID == Head.ListID).filter(Head.ID == head_node_id)
В любом случае, чтобы пройти по связанному списку, вам нужно получить ГОЛОВУ / ХВОСТ по его идентификатору, а затем пройти как обычно.
Примечание. Здесь я не уверен, что SA распознает, что эталонные объекты уже загружены в сеанс, или выдаст другие операторы SQL для каждого из них, что не позволит выполнить массовую загрузку.
2) Заменить связанный список расширением Ordering List
:
Пожалуйста, прочитайте Список заказов Документация. Вполне может быть, что реализация Ordering List
будет достаточно для использования вместо связанного списка