Джанго, полиморфизм и проблема N + 1 запросов - PullRequest
3 голосов
/ 10 апреля 2011

Я пишу приложение в Django, где я хотел бы использовать неявное наследование при использовании ForeignKeys.Насколько мне известно, единственный способ справиться с этим - использовать библиотеку django_polymorphic (в Django нет наследования таблиц, ПОЧЕМУ, ПОЧЕМУ?).

Я хотел бы знать опоследствия для производительности этого решения.Какие типы соединений выполняются при выполнении полиморфных запросов?Должен ли он попадать в базу данных несколько раз по сравнению с обычными запросами (печально известная проблема N + 1 запросов)?Документы предупреждают, что «типы запросов, которые выполняются, не обрабатываются эффективно современными RDBM»?Однако это не говорит, что это за запросы.Любая статистика, опыт был бы действительно полезным.

РЕДАКТИРОВАТЬ:

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

Ответы [ 3 ]

2 голосов
/ 01 мая 2012

Django-Typed-Models - это альтернатива Django-Polymorphic, которая использует простой и понятный подход к решению проблемы наследования одной таблицы.Он работает с атрибутом type, который добавляется в вашу модель.Когда вы сохраняете его, класс сохраняется в атрибуте type.Во время запроса атрибут используется для установки класса результирующего объекта.

Он выполняет то, что вы ожидаете, в отношении запросов (каждый объект, возвращаемый из набора запросов, является пониженным классом) без необходимости использования специального синтаксиса или страшногоОбъем кода, связанный с Джанго-Полиморфным.И никаких дополнительных запросов к базе данных.

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

Хорошо, я немного покопался и нашел этот замечательный отрывок:

https://github.com/bconstantin/django_polymorphic/blob/master/DOCS.rst#performance-considerations

Так, к счастью, эта библиотека делает что-то разумное.Это приятно знать.

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

В Django унаследованные модели внутренне представлены через OneToOneField.Если вы используете select_related() в запросе, Django будет следовать взаимно-однозначному отношению вперед и назад, чтобы включить ссылочную таблицу в соединение;так что вам не нужно будет дважды обращаться к базе данных, если вы используете select_related.

...