Отдельный запрос на получение и обращение к базе данных для каждого сообщения, чтобы получить статус «как»

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

1. Наименьшее количество попаданий в базу данных:

Сделайте один sql-запрос и получите похожую запись для каждого идентификатора сообщения, если они существуют. Теперь я использую собственный тег шаблона django, чтобы увидеть, существует ли похожая запись для текущего сообщения в Queryset путем поиска в массиве, который содержит похожие статусы всех сообщений . Таким образом, я использую базу данных для получения всех значений и поиска определенного значения из списка с помощью python.

2. Отдельный запрос к базе данных для каждого запроса:

Здесь я использую тот же настраиваемый тег шаблона, но для поиска в Queryset я использую базу данных mysql для большей части тяжелой работы. Я использую model.objects.get() для каждой записи.

Что является более эффективным алгоритмом. Также я планировал получить еще один сервер базы данных, может ли это изменить выбор, если сетевая задержка составляет всего около 0,1 мс.

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

Пример запроса для первого метода может быть таким:

Пусть post_list будет сообщением QuerySet

models.likes.objects.filter(user=current_user,post__in = post_list)

person krishnan    schedule 30.08.2015    source источник
comment
У меня есть одно слово для вас: benchmarking. Нет простого ответа, все будет зависеть от ваших моделей, структуры базы данных, конфигурации сервера и даже используемого оборудования. В некоторых случаях python будет быстрее, в других лучше фильтровать на уровне базы данных.   -  person GwynBleidD    schedule 30.08.2015
comment
Немного сложно читать ваш вопрос, потому что в нем так много опечаток и упущений. "Make one sql query and get like entry every post id if they exist." Я действительно не уверен, что вы пытаетесь сказать здесь.   -  person Konstantin Schubert    schedule 30.08.2015
comment
@krishnan Я не могу понять, что ты пишешь. Слишком много грамматических ошибок. Мой комментарий относился к этому, он не давал советов по теме.   -  person Konstantin Schubert    schedule 30.08.2015


Ответы (1)


Это не прямой ответ на ваш вопрос, но, тем не менее, я надеюсь, что он будет полезен.

и каждый из этих лайков хранится в модели, отличной от модели, используемой для новостной ленты.

Я думаю, что у вас есть проблема с дизайном здесь. Лучше создать модель, описывающую пост, а затем добавить поле users_that_liked_it в качестве отношение "многие ко многим" к вашей пользовательской модели. Затем вы можете сделать что-то вроде post.users_that_liked_it и получить набор запросов всех пользователей, которым понравилась ваша страница.

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

Наконец, если вас больше всего беспокоит производительность, вам, вероятно, все равно не следует использовать Django. Это просто не так быстро. Django дает вам возможность писать чистый и лаконичный код. Это гораздо важнее для нового проекта, чем производительность. Спросите себя: сколько (личных) проектов терпит неудачу из-за плохой работы? И сколько терпят неудачу из-за того, что создатель попадает в беспорядочный код?

Вот мой совет: отдайте предпочтение ясности, а не производительности. Особенно в молодом проекте.

person Konstantin Schubert    schedule 30.08.2015
comment
Большое спасибо @Konstantin. Добавление отношения «многие ко многим» действительно дало мне новое понимание. Но мне не нужен список всех, кому понравился пост разве это не будет лишней нагрузкой для базы данных? . Скорее, аналогично использованию отношения «многие ко многим», есть способ получить только запись, соответствующую текущему вошедшему в систему пользователю. - person krishnan; 30.08.2015
comment
Вместо этого вы также можете добавить поле «многие ко многим» в пользовательскую модель (например: user.posts_the_user_liked), но это немного сложно, потому что вам нужно будет изменить пользовательскую модель. В качестве альтернативы, с дизайном, который я предложил, вы можете получить все сообщения, которые понравились пользователю, через: user.post_set.all() Пожалуйста, прочитайте stackoverflow.com/questions/9352662/ для получения дополнительной информации. Как я уже сказал, я бы больше беспокоился о чистоте кода, чем о производительности. - person Konstantin Schubert; 30.08.2015
comment
Я реализовал модель UserProfile, которая следует взаимно-однозначным отношениям с моделью auth_user. Я уже создал работающую социальную сеть, поэтому теперь я считаю, что пришло время ее оптимизировать. Если я получу все сообщения пользователя понравилось, полагаю, что меня все равно заставят искать по всему списку только те лайки, которые касаются постов в контексте. Будет ли это отличаться от models.likes.objects.filter(user=current_user, post__in=posts_list) - person krishnan; 30.08.2015
comment
@кришнан я не знаю. Прости. - person Konstantin Schubert; 30.08.2015