Подтвердить что ты не робот

Каковы ограничения Django ORM?

Я слышал, что разработчики не хотели использовать ORM, но не знаю почему. Каковы недостатки ORM?

4b9b3361

Ответ 1

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

Но, поскольку вы просили о недостатках...

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

Проблема заключается в том, что ORM будет отображаться на основе "один класс → одна таблица", что не всегда работает.

Если у вас очень сложная модель данных, которая, в идеале, не может быть должным образом представлена ​​одной таблицей БД, тогда вы можете обнаружить, что вы тратите много времени на борьбу с ОРМ, а не на то, чтобы она работала для вас.

На практическом уровне вы обнаружите, что всегда есть обходное решение; некоторые разработчики будут сторонниками поддержки/против ORM, но я предпочитаю гибридный подход. Django хорошо работает для этого, так как вы можете легко переходить на необработанный SQL по мере необходимости. Что-то вроде:

Model.objects.raw("SELECT ...")

ORM занимают много работы из 99,99% других случаев, когда вы выполняете простые операции CRUD с вашими данными.

По моему опыту, две наилучшие причины избежать ORM в целом:

  • Когда у вас есть сложные данные, которые часто извлекаются через множественные объединения и агрегации. Часто писать SQL вручную будет яснее.
  • Производительность. ORM довольно хороши при построении оптимизированных запросов, но ничто не может конкурировать с написанием хорошей, эффективной части SQL.

Но, когда все сказанное и сделанное, после большой работы с Django, я могу с одной стороны подсчитать количество случаев, когда ORM не позволил мне делать то, что я хочу.

Ответ 2

Создатель ответа SQLAlchemy на вопрос django считается теперь pythonic.. Это показывает много различий и глубокое понимание системы.

sqlalchemy_vs_django_db обсуждение в reddit

Примечание. Обе ссылки довольно длинные, потребуется время для чтения. Я не пишу сущность из них, что может привести к недоразумениям.

Ответ 3

Другой ответ от поклонника Django, но:

  • Если вы используете наследование и запрос для родительских классов, вы не можете получить детей (в то время как вы можете с SQLAlchemy).
  • Group By и Having действительно трудно перевести с помощью aggregate/annotate.
  • Некоторые запросы ORM make просто смехотворно длинны, а иногда вы и с такими вещами, как model.id IN [1, 2, 3... ludicrous long list]
  • Есть способ спросить, где "материал находится в поле", используя __contains, но не "поле в материалах". Поскольку нет портативного способа сделать это через СУБД, написание необработанного SQL, потому что это действительно раздражает. Многие небольшие случаи, такие как этот, появляются, если ваше приложение начинает быть сложным, потому что, как сказал @Gary Chambers, данные в СУБД не всегда совпадают с моделью OO.
  • Это абстракция, а иногда абстракция утечки.

Но более чем часто люди, с которыми я встречаюсь, не хотят использовать ORM, делают это по неправильной причине: интеллектуальная лень. Некоторые люди не приложат усилий, чтобы дать справедливую попытку чего-то, потому что они что-то знают и хотят придерживаться этого. И страшно, сколько из них вы можете найти в области информатики, где большая часть работы связана с поддержанием нового материала.

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

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

Ответ 4

Существуют различные проблемы, которые, как представляется, возникают с каждой системой объектно-реляционного сопоставления, о которой я думаю, что классическая статья принадлежит Теду Ньюварду, который описал тему как "Вьетнам компьютерных наук" . (Там также followup в ответ на комментарии к этому сообщению и некоторые комментарии от Qaru own Jeff Atwood .)

Кроме того, одна простая практическая проблема с системами ORM заключается в том, что им трудно понять, сколько запросов (и каких запросов) фактически выполняется определенным битом кода, что, очевидно, может привести к проблемам с производительностью. В Django использование assertNumQueries утверждения в ваших модульных тестах действительно помогает избежать этого, как и при использовании django-devserver, замена для runserver, которая может выводить запросы по мере их выполнения.

Ответ 5

Одна из самых больших проблем, которые приходят на ум, заключается в том, что создание наследования в Django ORM затруднено. По сути, это связано с тем, что (Django) уровни ORM пытаются преодолеть разрыв, будучи как реляционными, так и OO. Другое дело, конечно, несколько внешних внешних полей.

В Django ORM одно зарядное устройство - это то, что они абстрагируют большую часть ядра базы данных, что писать эффективные, масштабируемые приложения с ними невозможно. Для некоторых видов приложений - тех, у кого есть миллионы доступов и сильно взаимосвязанных моделей - это утверждение часто верно.

Подавляющее большинство веб-приложений никогда не доходят до такой огромной аудитории и не достигают такого уровня сложности. Оркестры Django предназначены для быстрого получения проектов с нуля и для того, чтобы помочь разработчикам перейти к проектам, управляемым базами данных, не требуя глубокого знания SQL. По мере того, как ваш веб-сайт становится все более популярным, вам, безусловно, нужно будет проверять производительность, как описано в первом разделе этой статьи. В конце концов, вам может потребоваться начать замену ORM-управляемого кода необработанных SQL или хранимых процедур (читать SQLAlchemy и т.д.).

К счастью, возможности ORM Django продолжают развиваться. Библиотека агрегации Django V1.1 является важным шагом вперед, позволяя эффективно генерировать запросы, сохраняя при этом знакомый объектно-ориентированный синтаксис. Для большей гибкости разработчики Python также должны смотреть на SQLAlchemy, особенно для веб-приложений Python, которые не полагаются на Django.

Ответ 6

IMHO большая проблема с Django ORM - отсутствие составных первичных ключей, это мешает мне использовать некоторые устаревшие базы данных с помощью django.contrib.admin.

Я предпочитаю SqlAlchemy над Django ORM, для проектов, где django.contrib.admin не важен, я предпочитаю использовать Flask вместо Django.

Django 1.4 добавляет в ORM несколько хороших "пакетных" инструментов.