Ускорит ли этот трюк поиск в Django ForeignKey? - PullRequest
0 голосов
/ 15 января 2012

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

Например, представьте себе сценарий, в котором учитель может иметь много учеников, но у ученика может быть только один учитель.,Можно назначить ForeignKey для ученика, который связывает каждого ученика с учителем.В таблице SQL для ученика столбец с именем teacher_id отслеживает, какой учитель имеет ученик.

При запросе, у которого у ученика есть учитель X, все строки таблицы ученика должны быть отсканированы, чтобы получить полный набор запросов., что кажется неэффективным.

Что если я запрограммирую Django так, чтобы каждый раз, когда учитель назначался ученику, запись в таблице учителя, скажем, student_id_list обновлялась;Идентификатор учащегося будет добавлен в список других идентификаторов учеников, разделенных запятыми.

Таким образом, когда запрос ищет всех учеников учителя, я могу просто использовать этот список учеников, разделенный запятыми.Идентификаторы для поиска учеников, которые являются быстрыми (идентификатор является первичным ключом) и эффективными (не все строки таблицы учеников должны сканироваться).

Столбец teacher_id в таблице учеников все еще будет использоваться;данные будут просто храниться дважды.

Это сделает мое приложение быстрее?Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 января 2012

Я не уверен, но это выглядит неправильно.Потому что вы получите каждого ученика с некоторым идентификатором - это будет N квестов в базу данных, где N - количество учеников для учителя, а вы можете фильтровать учеников по teacher_id, и это будет одиночный квест для целого числа учеников.,Это может зависеть от индексов в БД, но это будет то же самое, что «ВЫБРАТЬ из« студентов »...»

1 голос
/ 15 января 2012

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

Как сказано в документации:

django-составление обеспечивает абстрактный способ денормализации данных из ваши модели простым декларативным способом через специальную универсальную модель поле с именем CompositionField.

Большинство случаев денормализации данных довольно распространены, поэтому В django-составной части есть несколько полей быстрого доступа, которые обрабатывают большинство из них.

CompositionField - поле модели django, которое предоставляет интерфейс для данных денормализация.

1 голос
/ 15 января 2012

Вместо того, чтобы пытаться взломать слой базы данных для переноса дополнительных метаданных в базу данных , почему бы не создать соответствующий индекс в вашей базе данных или, если это не поможет, использовать некоторую комбинацию представления илихранимой процедуры, и использовать необработанный SQL-запрос для ее вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...