Как сделать правильную архитектуру платных подписчиков на сайте?
В БД это дело логично хранить в виде таблиц пользователей и подписок. При подписке создавать запись, где хранить 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
Ну, поле статуса пользователя донат/не донат, связующая таблица с 2 полями кто и на кого (user_id), ну и что-то придумать где будет храниться дата и оплаченное время...
Я бы сделал так