PHP-добавление пользователей в друзья
У меня есть социальный сайт, вы можете добавлять друзей. Вот как это работает:
- нажмите кнопку Добавить в друзья
- Добавить пользователя, который нажал на строка базы данных, как это в Столбцах [Боб][Фред][123123]
- Фред принимает его с секретом в проверке ссылка, по электронной почте.
- тогда это добавляет еще одну строку в база данных наоборот, как это [Фред][Боб][123123]
затем я могу определить, являются ли они друзьями или нет и, если они были приняты.
однако это, конечно, не правильный путь. Теперь я очень не уверен в том, какой способ может быть лучше и работать более гладко.
3 ответов
на самом деле нет правильного или неправильного пути, это то, что вы когда-либо решите использовать, в конце концов, это ваш код, поэтому все, что вы выбираете и работает для вас.
тем не менее, вы совершенно правы, ввод двух строк будет очень тяжелым накладным расходом и использовать дополнительное пространство, по-видимому, без веской причины. Гораздо проще вы можете установить другой столбец в своей БД:
user_1
| user_2
| accept_code
| accepted
user_1
запросы на добавление user_2
как друг-ты установил accept_code
создание записи в БД. Установите структуру БД для установки до определить в виде false. Затем, когда строка впервые создается, пользователи в настоящее время не являются друзьями.
используя Ваш пример: Боб просит Фреда как друга. Теперь вы DB будете выглядеть так:
bob
| fred
| 123123
| false
, когда user_2
входит в accept_code
, затем измените accepted
значение true.
bob
| fred
| 123123
| true
таким образом, один запрос сообщит вам, являются ли два пользователя друзьями, а не два запроса, чтобы узнать, есть ли у вас две соответствующие записи БД.
user_1
| user_2
| accept_code
| accepted
bob
| fred
| 123123
| true
bob
| joe
| 321321
| false
bob
| alex
| 789789
| true
так, например, psuedo выбрать может быть, найти всех друзей для Боба:
SELECT user_2 FROM relationships WHERE user_1="bob" AND accepted="true"
результат будет такой:
fred
alex
обновление в соответствии с комментариями:
DB Структура:
user_1
| user_2
| accept_code
| accepted
bob
| fred
| 123
| true
bob
| alex
| 123
| true
bob
| joe
| 123
| false
ste
| bob
| 123
| true
joe
| alex
| 123
| true
выберите заявление:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'current_user' OR user_2 = 'current_user');
Пример 1 - Боб входит в систему, он запросил друзей и был запрошен как друг:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'bob' OR user_2 = 'bob');
результат:
bob
| fred
| 123
| accepted
bob
| alex
| 123
| accepted
ste
| bob
| 123
| accepted
Пример 2 - Алекс входит в систему, он никогда не запрошено и друзья, но был запрошен как друг:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'alex' OR user_2 = 'alex');
результат:
bob
| alex
| 123
| accepted
joe
| alex
| 123
| accepted
Пример 3 - Джо входит в систему, он попросил друга и отказался от друга:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'joe' OR user_2 = 'joe');
результат:
joe
| alex
| 123
| accepted
отношения базы данных социальных сетей могут стать очень сложными быстро, особенно по мере увеличения трафика и потока запросов. Есть большие данные, доступные из ведущих источников, таких как Facebook в своих блогах разработчиков о том, как они модифицировали и скорректировали свои системы для масштабирования по мере увеличения трафика.
нет ни одного правильного способа создать отношения-это зависит от вашей структуры кода - но это, как говорится, делает ваши два запроса для создания простое отношение один к одному и дублирование данных правильно предполагается ненужными дополнительными накладными расходами.
вы можете создать простую таблицу соединений с идентификаторами двух пользователей, одно поле, в котором находится запрос (первичный ключ int пользователя), а другое-запрос на утверждение (также первичный ключ int.) У вас может быть другое поле status int с числовыми значениями, которые соответствуют статусу отношения.
вы всегда следует использовать цифровые клавиши для идентификации пользователя - вы никогда не знаете, сколько " Джонс присоединится! Убедитесь, что у вас есть даже простая таблица "пользователи" с идентификаторами пользователей, которые являются уникальными ключами.
UserID|Name
1 Frank
2 John
Это, конечно, может содержать другую информацию, фамилию, местоположение, пол, любимый фильм Сильвестра Сталлоне и т. д.
отношения могут быть созданы в отдельной таблице отношений со следующей структурой... Поэтому, когда Фрэнк (id 1) просит Джона (id 2), мы в итоге ряд.
RelationshipID|RequestedBy|Receipient|RequestStatus|ConfirmationCode
(primary key) 1 2 0 (however you format your url strings)
у вас может быть первичный ключ для всех отношений. Каждая отдельная связь будет идентифицироваться.
кроме того, я лично интегрировал бы другую таблицу для определения переменной состояния.
StatusIdentifier|StatusDefinition
0 Requested but not yet approved
-1 Requested and denied (mark for deletion)
1 Requested and approved (active friendship)
таким образом, вы могли бы расширить типы связей в программе, если вы когда-либо хотели больше, например, зафрендила потом удалили, заблокировали и т. д. В большинстве приложений, которые я развернул, такие данные были хорошими кандидат на XML, но нет ничего плохого в том, чтобы бросить его в базу данных. Ответы получателя должны получить RelationshipID, а затем обновить это значение состояния.
добавление метки времени для обновлений в таблице отношений-тоже хорошая идея.
используя эту структуру, вы можете легко запросить всех друзей пользователя, используя их основной идентификатор из таблицы пользователя. Давайте введем Фрэнкса в массив:
$sql = 'SELECT Recipient FROM FriendRelationships WHERE RequestedBy = 1 AND RequestStatus = 1';
это получает все активные идентификаторы пользователя друга для Фрэнка, поскольку он запрашивает (1), и мы ограничиваемся запросами, которые были одобрены получателем.
привет вы можете попробовать эту логику.
допустим, Боб хочет добавить Фреда в друзья.
-
Боб отправить Фред добавить как друг
действие: есть таблица поиска базы данных как друзья: [Боб] [Фред] [скрыть - только сделать его видимым, когда Боб принимает его]
-
Фред принимает запрос после проверки Действие: сделайте [скрыть] - - - > [видимым]
теперь у вас есть отношения с пользователем и друзьями.[каждая строка в поиске таблица друзей]
надеюсь, это будет полезно