Не слишком ли много запросов к базе данных для всех в списке пользователей?


В настоящее время я использую MySQL и MyISAM.

У меня есть функция, которая возвращает массив идентификаторов пользователей друзей или пользователей в целом в моем приложении, и при их отображении лучше всего использовать значение foreach.

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

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

Какие-либо общие структуры или советы о том, с помощью чего я могу соответствующим образом отобразить список?

Является ли мое количество запросов (1:1 на пользователей в списке) неуместным? (хотя страницы 0..n пользователей, по 10 за раз, кажутся не такими плохими, я просто понимаю.)

Author: Kenny R., 2011-06-26

3 answers

Вы можете использовать метод IN() MySQL, т.Е.

SELECT username,email,etc FROM user_table WHERE userid IN (1,15,36,105)

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

 4
Author: Dan Smith, 2011-06-25 23:13:22

Почему вы не могли просто использовать левое соединение, чтобы получить все данные за 1 кадр? Похоже, вы получаете список, но тогда вам нужно получить всю информацию только об одном пользователе. Это правильно?

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

Например, список друзей может содержаться в текстовом столбце записи пользователя.

 1
Author: meteorainer, 2011-06-25 23:11:17

Независимо от того, ожидаете ли вы иметь небольшую базу данных или большую базу данных, я бы рассмотрел возможность использования движка InnoDB, а не MyISAM. У него немного больше накладных расходов на обработку, чем у MyISAM, однако вы получаете все дополнительные преимущества (по мере роста вашего хобби), включая ПРИСОЕДИНЕНИЕ, которое позволит вам извлекать определенные данные из нескольких таблиц:

SELECT u.`id`, p.`name`, p.`avatar`
  FROM `Users` AS u
  LEFT JOIN `Profiles` AS p USING `id`

Вернет идентификатор пользователей, а также имя и аватар из профилей (где идентификатор обеих таблиц совпадает)

Существует множество ресурсов в Интернете, говоря о нормализации базы данных, вам может понравиться: http://www.devshed.com/c/a/MySQL/An-Introduction-to-Database-Normalization/

 1
Author: Aaron Murray, 2011-06-25 23:12:48