Оформление реферала - довольно популярная задача. Он появляется в разных проектах. Если у вас, например, бизнес электронной коммерции, вам нужна реферальная система, чтобы предлагать покупателям возможность оплачивать ваши товары бонусами за приглашение новых людей. Если у вас есть 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;

Но если вы хотите создать многоуровневую реферальную систему, это не просто отношения реферала и реферала.

Я решил изучить два пути:

  1. Добавить в созданную таблицу level столбец
  2. Использовать существующую структуру таблицы

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

Спасибо, что прочитали эту статью. Надеюсь, это поможет тебе. Хлопайте, если нравится. Напишите свои комментарии, если у вас есть предложения, вопросы или проблемы.