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), и мы ограничиваемся запросами, которые были одобрены получателем.


привет вы можете попробовать эту логику.

допустим, Боб хочет добавить Фреда в друзья.

  1. Боб отправить Фред добавить как друг

    действие: есть таблица поиска базы данных как друзья: [Боб] [Фред] [скрыть - только сделать его видимым, когда Боб принимает его]

  2. Фред принимает запрос после проверки Действие: сделайте [скрыть] - - - > [видимым]

    теперь у вас есть отношения с пользователем и друзьями.[каждая строка в поиске таблица друзей]

    надеюсь, это будет полезно