Материализованный ключ в SQLAlchemy - PullRequest
2 голосов
/ 29 марта 2011

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

Однако у меня есть естественный ключ, который работает так: "" - это корень

  • "a", "b", "c" и т. д. являются потомками ""
  • "aa", "ab", "ac" и т. д. являются потомками "a"
  • "ba", "bb", "bc" и т. Д. Являются потомками "b"
  • "aaa", "aab", "aac" и т. Д. Являются потомками "aa"

Таким образом, для каждого уровня в дереве есть один символ, и дочерние узлы каждого узла - это узлы с одинаковым началом и одним добавленным символом.Это называется «материализованным ключом»

Как бы я это сделал, используя маппер SQLAlchemy без добавления дополнительного атрибута для ссылки на родителя?

Примечание: меня интересует только чтение взаимосвязи, если что-то вроде node.children.append(child) не работает, это нормально.Кроме того, я застрял на версии 0.4.8, однако, если это невозможно в этой версии, но только в более новой, я мог бы попытаться обновить.

РЕДАКТИРОВАТЬ У меня естьполучил первый ответ в списке рассылки SA .Это работает, но не на основе картографа, как хотелось бы (например, для использования eagerload)

1 Ответ

1 голос
/ 12 апреля 2011

Я понимаю ограничение вопроса, но почему вы пытаетесь избежать использования дополнительного ключа?Конечно, это избыточная информация, но в зависимости от ваших данных (количество строк, средняя длина ключей) наличие дополнительных ключей может фактически улучшить вашу производительность на SELECT с, и вы сможете использовать готовую загрузку отношенийв SA наиболее тривиальным способом.

Например, вы можете сделать следующее:

  • Добавить еще один числовой идентификатор как PK и связать дочерний / родительский элемент с этим.
  • Добавить еще один строковый идентификатор для указания на родительский объект (Key: Varchar, ParentKey: Varchar).В некоторых СУБД (например, MSSQL) у вас может быть столбец PERSISTENT COMPUTED, так что вашему клиенту даже не нужно предоставлять родительский ключ, и он будет автоматически рассчитываться по столбцу KEY по формуле (вырезать последний символ).В этом случае у вас есть индекс БД для этого столбца и очень быстрый поиск отношений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...