Не слишком ли много запросов к базе данных для всех в списке пользователей?
В настоящее время я использую MySQL и MyISAM.
У меня есть функция, которая возвращает массив идентификаторов пользователей друзей или пользователей в целом в моем приложении, и при их отображении лучше всего использовать значение foreach.
Теперь моя проблема в том, что у меня есть только идентификаторы, поэтому мне нужно будет вложить вызов базы данных, чтобы получить другую информацию каждого пользователя (т.Е. Имя, аватар, другие поля) на основе идентификатора пользователя в цикле.
Я не ожидаю сотен тысяч пользователей (в основном для хобби обучение), хотя как мне это сделать, например, гибкость размещения кода в foreach для отображения, но не полагаясь на массивы идентификаторов, поэтому мне не повезло использовать один запрос?
Какие-либо общие структуры или советы о том, с помощью чего я могу соответствующим образом отобразить список?
Является ли мое количество запросов (1:1 на пользователей в списке) неуместным? (хотя страницы 0..n пользователей, по 10 за раз, кажутся не такими плохими, я просто понимаю.)
3 answers
Вы можете использовать метод IN() MySQL, т.Е.
SELECT username,email,etc FROM user_table WHERE userid IN (1,15,36,105)
, который вернет все строки, в которых идентификатор пользователя совпадает с этими идентификаторами. Это становится менее эффективным, чем больше идентификаторов вы добавляете, но 10 или около того, которые вы упоминаете, должны быть в порядке.
Почему вы не могли просто использовать левое соединение, чтобы получить все данные за 1 кадр? Похоже, вы получаете список, но тогда вам нужно получить всю информацию только об одном пользователе. Это правильно?
Помните, что базы данных - это результирующие наборы, и хотя обычно вы можете вернуть только одну строку, если вам это нужно, вам почти никогда не нужно получать одну строку, а затем возвращаться за дополнительной информацией.
Например, список друзей может содержаться в текстовом столбце записи пользователя.
Независимо от того, ожидаете ли вы иметь небольшую базу данных или большую базу данных, я бы рассмотрел возможность использования движка 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/