@Emmet1

Как сделать правильную архитектуру платных подписчиков на сайте?

Задача - сделать на сайте возможность пользователям одной группы подписываться(донатить деньги) на месяц на пользователей другой группы.
Все пользователи уже разбиты на нужные группы. Для подписчика будут доступны некие материалы, допустим блог или новости.
Я впервые сталкиваюсь с такой задачей, поэтому мне интересно, как грамотно записать в БД список юзеров которые задонатили определенному пользователю. А тем более, как правильно спустя месяц их оттуда, с донатеров, убирать.
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 2
В БД это дело логично хранить в виде таблиц пользователей и подписок. При подписке создавать запись, где хранить id пользователей (на кого и кто подписался), а также время начала и окончания подписки.

Пример структуры
CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `type` enum('AUT','SUB') NOT NULL DEFAULT 'SUB',
  PRIMARY KEY (`id`)
);

CREATE TABLE `subscription` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `author_id` int(11) NOT NULL COMMENT 'На кого подписываются',
  `subscriber_id` int(11) NOT NULL COMMENT 'Кто подписывается',
  `created_at` timestamp NOT NULL COMMENT 'Время подписки',
  `expired_at` timestamp NOT NULL COMMENT 'Когда истекает подписка',
  PRIMARY KEY (`id`)
);

# Пусть у нас есть один автор и два пользователя:
INSERT INTO `user` (`id`, `name`, `type`)
VALUES
	(1, 'Alex Pushkin', 'AUT'),
	(2, 'Vasya Pupkin', 'SUB'),
	(3, 'Jane Doe', 'SUB');

# Один из них подписался на Автора месяцем ранее, второй недавно
INSERT INTO `subscription` (`author_id`, `subscriber_id`, `created_at`, `expired_at`)
VALUES
	(1, 2, '2020-02-15 13:46:12', '2020-03-15 13:46:12'),
	(1, 3, '2020-03-15 13:46:12', '2020-04-15 13:46:12');


Если нам надо узнать активные подписки, просто выбираем записи с нужным автором, у которых время подписки подходит.
SELECT * 
FROM subscription
WHERE author_id = 1 and expired_at < CURRENT_TIMESTAMP and created_at < CURRENT_TIMESTAMP;


Дальнейшую логику, наверное, додумаете сами.

Можете поиграться в песочнице:
sqlfiddle.com/#!9/f4fc27/3/0
Ответ написан
Комментировать
Exebeche
@Exebeche
Осваиваю программирование
Ну, поле статуса пользователя донат/не донат, связующая таблица с 2 полями кто и на кого (user_id), ну и что-то придумать где будет храниться дата и оплаченное время...
Я бы сделал так
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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