Множественный связанный список с SQLAlchemy и MySQL - PullRequest
1 голос
/ 07 марта 2012

Я хочу иметь несколько связанных списков в таблице SQL, используя MySQL и SQLAlchemy (0.7).Все списки с его первым узлом с родителем, равным 0, и заканчивающимся дочерним узлом, равным 0. Идентификатор представляет список, а не отдельный элемент.Элемент идентифицируется как PK

С некоторым пропущенным синтаксисом (не относящимся к проблеме) он должен выглядеть примерно так:

id(INT, PK)
content (TEXT)
parent(INT, FK(id), PK)
child(INT, FK(id), PK)

Поскольку таблица имеет несколько связанных списков, как можно вернутьвесь список из базы данных я выбираю конкретный идентификатор и родительский 0 =

Например:

SELECT * FROM ... WHERE id = 3 AND parent = 0   

1 Ответ

0 голосов
/ 08 марта 2012

Учитывая, что у вас есть несколько связанных списков, хранящихся в одной и той же таблице, я предполагаю, что вы храните либо HEAD, либо / или TAIL тех, которые находятся в некоторых других таблицах. Несколько идей:

1) Сохранить связанный список: Первым большим улучшением (также предложенным в комментариях) с точки зрения запроса данных было бы наличие некоторого общего идентификатора (давайте назовем его ListID) всех узлов в одном списке. Здесь есть несколько вариантов:

  • Если на каждый список ссылаются только из одного объекта (строки данных) [я бы даже сформулировал вопрос как «Список принадлежит одному объекту?], Тогда это ListID может быть просто (основным) идентификатором объекта-держателя с ForeignKey сверху для обеспечения целостности данных. В этом случае запрос всего списка очень прост. Фактически, вы можете определить relationship и перемещаться по нему как my_object.my_list_items.
  • Если список используется / на него ссылаются несколько объектов, то можно создать другую таблицу, которая будет состоять только из одного столбца ListID (PK), и каждый узел / элемент снова будет иметь ForeignKey или что-то подобное
  • Иначе, большие списки могут быть загружены в двух запросах / инструкциях SQL:
    1. запросить ГОЛОВУ / ХВОСТ по его идентификатору
    2. запросить весь список на основе полученных 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 будет достаточно для использования вместо связанного списка

...