Оформление реферала - довольно популярная задача. Он появляется в разных проектах. Если у вас, например, бизнес электронной коммерции, вам нужна реферальная система, чтобы предлагать покупателям возможность оплачивать ваши товары бонусами за приглашение новых людей. Если у вас есть ICO, вам нужна реферальная система для начисления бонусных токенов. И примеров, когда бизнесу нужна реферальная система, очень много.
А создать одноуровневую реферальную систему довольно просто. Вы просто добавляете одну таблицу в БД следующим образом:
create table `referals` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `referer_id` int(11) unsigned NOT NULL, `referal_id` int(11) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `referer_id` (`referer_id`), UNIQUE KEY `referal_id` (`referal_id`) );
Затем вы можете выбрать всех рефералов по идентификатору реферала:
SELECT referal_id FROM referals WHERE referer_id = some_user_id;
Но если вы хотите создать многоуровневую реферальную систему, это не просто отношения реферала и реферала.
Я решил изучить два пути:
- Добавить в созданную таблицу
level
столбец - Использовать существующую структуру таблицы
В первом случае для каждого нового рефреала вы должны добавить строки на каждом уровне, например, если у вас есть 3 уровня реферала, и новый реферал исходит от кого-то на 2-м уровне реферала, тогда вам нужно добавить 3 строки:
insert into referals(referer_id, referal_id, level) value(1, 4, 3); insert into referals(referer_id, referal_id, level) value(2, 4, 3); insert into referals(referer_id, referal_id, level) value(3, 4, 3);
И таким образом вам нужно найти всех предыдущих рефереров. Легче получить доступ к данным и проще найти все рефералы для одного пользователя, например
select referal_id, level from referals where referer_id = some_user_id;
Или выберите всех рефералов на уровне 2 и 3:
select referal_id from referals where referer_id = some_user_id and level = 2 or level = 3;
Но если вы увеличиваете реферальный уровень в своей системе, то каждый новый реферал будет занимать минимум 1 строку и максимум n строк, где n - реферальный уровень. А через некоторое время ваша реферальная таблица увеличится на тысячи строк.
Во втором случае изменять созданную таблицу не нужно. Вы просто изменяете свой SQL-запрос. Вот пример трехуровневой реферальной системы:
SELECT ref1.referal_id as lev1, ref2.referal_id as lev2, ref3.referal_id as lev3, ref4.referal_id as lev4, ref5.referal_id as lev5 from referals as ref1 left join referals as ref2 on ref2.referer_id = ref1.referal_id left join referals as ref3 on ref3.referer_id = ref2.referal_id where ref1.referer_id = some_user_id;
Если вы хотите повысить свой реферальный уровень, вы просто добавляете новый запрос соединения.
Кроме того, вы можете выбрать всех пользователей в одном запросе.
SELECT ref1.referer_id as lev1, ref2.referer_id as lev2, ref3.referer_id as lev3, ref4.referer_id as lev4, ref5.referer_id as lev5 from referals as ref1 left join referals as ref2 on ref2.referal_id = ref1.referer_id left join referals as ref3 on ref3.referal_id = ref2.referer_id where ref1.referal_id = some_user_id;
Итак, в своей реферальной системе я решил использовать второй способ. Для меня основными преимуществами являются простейшая таблица рефералов, один SQL-запрос для получения всех рефералов и один SQL-запрос для получения всех рефералов.
Спасибо, что прочитали эту статью. Надеюсь, это поможет тебе. Хлопайте, если нравится. Напишите свои комментарии, если у вас есть предложения, вопросы или проблемы.