Поскольку вопрос недостаточно ясен (или я не могу понять его правильно), я бы предположил, что у вас есть 1 таблица с 2 столбцами: facebook_id, friends_json, и вы запрашиваете всех друзей друзей.Это худший случай, о котором я могу думать.Тем не менее, все, что вам нужно сделать, это 2 простых запроса:
- получить предмет с 1 попаданием в индекс, а затем получить uid из json, расшифровав его
- получить список друзей всех друзей с помощью "в"запросите с использованием идентификаторов, а затем вставьте их все в карту, чтобы избавиться от дубликатов.
ни одному из указанных выше запросов не нужно сканировать всю таблицу (и ее худший случай)
если вы можете дать больше информации о структуре вашей таблицы и вашей цели (что вы хотите извлечь из этих данных), мы можем помочь больше.
Редактировать: Ничто не сможет спасти ваш сервер, если выЯ должен выполнять сканирование таблицы при каждом попадании.
Редактировать:
В настоящее время у меня есть одна таблица: facebook_id, friends_json.В friends_json хранится имя пользователя и имя каждого друга этого пользователя facebook_id.Используя этот метод, каждая запись составляет около 10 КБ.Как только эта запись запрошена, мне не нужно делать дополнительных запросов, чтобы получить имя друга: это уже включено в friends_json.
Мой вопрос: лучше ли хранить только друзей?uids в friends_json, так что для каждого друга мне нужно выполнить запрос к другой таблице (friends_names), чтобы получить имя этого друга из этой таблицы (если недоступно, запросить его из Facebook).Этот второй метод экономит дисковое пространство, но мне действительно нужно выполнить большое количество запросов, прежде чем я смогу показать пользователю результат.
Цель состоит в том, чтобы сравнить список друзей в моей базе данных с текущимсписок друзей.Если пользователь удалил свой профиль на Facebook, я не могу больше запрашивать соответствующее имя, поэтому мне нужно сохранять имена в моей базе данных.
Пока вы получаете результат с помощью нажатияИндекс размера таблицы или строки не повлияет так сильно, как вы думаете.И объединение только для того, чтобы получать имена, когда вы сохраняете нормализацию uid, не является подходящим способом.В любом случае вы сохраняете таблицу «users» со столбцами «uid, name» и таблицей дружбы «uid1, uid2», или у вас есть нормализованные данные, включая uid и name.А что касается сравнения новых и старых списков друзей, вы все равно должны сделать это в php, используя uid (а не имена).получить список друзей из Facebook, сравнить его с текущим списком друзей, найти различия и применить к базе данных.В этом случае вам не нужно сканировать таблицы в любой точке вашего приложения.
Вот обычный способ сделать это (без json):
fb_users table: uid, name, is_app_user (PK: uid) fb_friends table: uid1, uid2 (PK: uid1, uid2)
получить друзей sql запрос:
SELECT ff.uid1, fu.name FROM fb_friends ff
LEFT JOIN fb_users fu ON ff.uid1 = fu.uid
WHERE ff.uid2 = $FBID
UNION
SELECT ff.uid2, fu.name FROM fb_friends ff
LEFT JOIN fb_users fu ON ff.uid2 = fu.uid
WHERE ff.uid1 = $FBID
и для добавления пользователей вы можете сделать хитрый трюк, чтобы обновлять имя каждый раз при смене имени (которое используется большую часть времени):
INSERT INTO fb_users(uid,name)
VALUES
($FBUD1, $FBNAME1),
($FBUD2, $FBNAME2)
...
ON DUPLICATE KEY name = VALUES(name)
и добавлять друзей, которых вы можетесделайте трюк так же, чтобы вам не приходилось беспокоиться о наличии AB и BA одновременно:
INSERT IGNORE INTO fb_friends(uid, uid1) VALUES(" . min($uid, $uid1) . ", " . max($uid, $uid1) . ");
это просто трюки, если вы решили сохранить свои данные реляционными, но я бы посоветовал сохранить ихвсе равно нормализовалось.Ваш метод json используется в большинстве случаев и не беспокоится о большом количестве места, поскольку размер данных обычно не блокирует серверы, а то, как вы запрашиваете данные (код) и как вы их захватываете (SQL запросов), где вы должны настроить.