Lumore
@Lumore
Front-end developer

Как правильно реализовать систему подписок PHP?

Здравстуйте,
Понадобилась потребность сделать систему подписок на сайте, к примеру как в интсаграме. Пользователь подписывается на другого пользователя и только тогда сможет зайти на его профиль.
Мой вариант: Создать таблицу subs, создать 2 поля "на кого подписался" , "кто подписался".
На странице профиля искать в таблице "SELECT * FROM subs WHERE sub-author = :sub-author".
Через foreach проверять подписчиков и с сессией пользователя, и в зависимости от true или false выводить контент страницы.
Правильно ли это? Если есть другой способ - поскажите пожалуйста.
  • Вопрос задан
  • 4825 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Мой вариант: Создать таблицу subs, создать 2 поля "на кого подписался" , "кто подписался".
норм. primary key по двум полям не забудьте.
Через foreach проверять подписчиков и с сессией пользователя, и в зависимости от true или false выводить контент страницы.
Это про ленту новостей как я понял? Вы хотите в цикле делать запросы? А если подписок будет несколько сотен?
Вообще задача отображения ленты событий - она весьма не тривиальная, и чем больше нагрузка - тем более она не тривиальная.

Пока у вас мало трафика решение в лоб - 2 запроса:
1) получаем user_id людей чьи посты надо показать
2) получаем посты select * from post where user_id IN (1,2,3,4)
именно так, в 2 запроса, без вложенных подзапросов!
Если подписчиков меньше ~1000 - будет работать хорошо.

Когда станет трафика сильно побольше - возникает более быстрое но более геморройное решение:
Для каждого пользователя храним в каком то быстром хранилище (например redis) id последних например 500-1000 постов которые он может видеть в ленте. Когда кто то делает пост - добавляем в список каждого его подписчика нужные id. Когда кто то удаляет пост / удаляет подписку - полностью перегенерим соответствующие списки.
На выводе соответственно
1) получаем этот список id постов
2) делаем select ... from post where id in (...)
Минус решения - нельзя без извращений и доп слоёв логики посмотреть более старые посты.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
kawabanga
@kawabanga
Предположим, ваша система работает на 5,10,100 пользователях.
А что, если в вашей системе будет 10000 К пользователей? И число совместных подписок может достигать 10000 0000 записей? например, у вас будет около 10К записей с текущим id автора. но зачем?

Не проще сделать селект
Select * from subs where author_id=:id and who_id=:whoid;

При этом у людей, кто подписался, должен быть свой ид тоже.
Итого, у вас всего 1 sql запрос без php логики, на то, что бы проверить , подписан ли человек на автора или нет.

Ну и в эту таблицу, я бы добавил time поле, с датой, когда человек подписался, что бы потом удобнее было следить за ботами.
Ответ написан
MrAbdrahimov
@MrAbdrahimov
Web-разработчик
Я бы сделал колонки author, sub-author
$connect = mysql_query("SELECT * FROM subs WHERE author = author");
while($perem = mysql_fetch_array($connect)) {
echo $perem[sub-author''];
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы