Как лучше хранить данные 7-и уровневой партнерки в БД в одной таблице или в разных?
Ребят, привет!
Такой теоретический вопрос - как лучше хранить данные? В разных таблицах или в одной?
Сейчас у меня такая структура - таблица USER и в ней лежат - ref1, ref2, ref3, ref4, ref5, ref6, ref7.
Но меня смущает такая структура, с одной стороны удобно вроде бы, но это наверное не правильно, т.к. будет происходить дублирование данных, что ни есть хорошо согласно правилам нормализации.
Соответственно возникает мысль создать 7 отдельных таблиц - Level1, Level2, Level3, Level4, Level5, Level6, Level7.
Но тут встает вопрос, что писать в эти таблицы? Если у кого-то есть опыт, подскажите пожалуйста, как лучше сделать. Просто уже начал писать код, но вот это что-то смущает меня. Просто вопрос, как потом отслеживать данные при выплатах партнерам. И не будет ли много запросов к БД?
Буду очень признателен, если поделитесь своим опытом - просьба не посылать в гугл и книжки, уже тонну материала перерыл. Одноуровневую партнерку реализовывал, а вот здесь вопрос.
Rsa97: Все 7 :) Это максимальное количество. Т.е. человек(корень) приглашает юзера, он регается по его ссылке партнерской, соответственно(приглашенныей юзер 1-го уровня) встает на первый уровень. Затем приглашенный юзер с первого уровня так же делиться ссылкой - и по ней регается юзер - он становится юзером 2-го уровня для корня и юзером первого уровня для юзера первого уровня, которые его пригласил. Исходя из этого - корень получает доход с юзера 2-го уровня и первого, а юзер первого уровня от корня, получает только со своего приглашенного. и так ниже идет, вплоть до 7-го уровня. Надеюсь понятно объяснил :)
Rsa97 Можете подсказать по этой системе Nested Set? Что-то догнать не могу. Переделал БД, включил в таблицу user поля - left_branch, right_branch, level - сделал их индексами, удалил эти ref1 и т.д. Вот вопрос по заполнению таблицы этой и как вытаскивать данные вышестоящего человека. С левой веткой то можно сделать быстро вытащить - достаточно указать в запросе WHERE id = {left_branch - 1}, а вот с правой веткой такое не пройдет. Можем в скайпе пообщаться? Я просто завис с этим, что-то туплю, уже несколько раз перечитал статью и доп.материалы, но все решение в голову не приходит.
Кирилл Лобанов: Посмотрите эту статью, здесь подробно расписана работа с Nested Set с запросами на SQL. Вам, в принципе, достаточно добавления потомка к известному родителю и поиска родителей данного потомка. Только при добавлении идут два запроса (собственно добавление и изменение границ), их лучше поместить в один блок TRANSACTION.
Rsa97 благодарю за ответ! :) Я и хотел использовать транзакцию для этой задачи :) За статью спасибо, наткнулся ночью на нее, но сил не было изучать :) Спасибо еще раз! :) Если возникнут вопросы, можно будет написать?
Rsa97 С Рождеством! :) Всех благ и всего самого лучшего! :) И можно задам вопрос :) Извините, что беспокою Вас :) Я вроде бы разобрался с деревом, ну по крайней мере начинаю догонять. :) Вот у меня в голове только не укладывается одно - суть следующая - у каждого нового человека в системе свои 7-м уровней, т.е. получается каждый новичок выступает в роле нового узла и как родитель нижестоящим. Вот в примере есть столбец - level - я его добавил, но вопрос в том, как потом отслеживать пользователей по уровням, т.е. я хочу строить схему команды юзера в личном кабинете. Получается в начале идет система - у нее уровень 0, потом иду я - у меня уровень 1, но у моего приглашенного должен быть уровень 1, а для системы это должен быть уровень 2. Затем этот человек приглашает еще одного, он встает для на уровень 1 для моего приглашенного, для меня на уровень 2, а для корня системы на уровень 3. И у каждого пользователя должно быть ограничение по 7-и уровням. Прошу прощения, что беспокою Вас такими глупыми вопросами, но честно скажу, догнать этот нюанс не могу. Я добавил еще в таблицу столбец parent_id, в него буду записывать id пригласившего. Подскажите пожалуйста, как вот отслеживать эту вещь? Что-то голову сломал :(
Кирилл Лобанов: parent_id смысла не имеет, просто получаете родителей в обратном порядке и берёте первый элемент (или 7 первых элементов, для распределения бонуса).
Для команды - если хотите получить дерево на семь подчинённых уровней, то просто рекурсивно получаете всех прямых (level = :user_level+1) потомков пользователя, пока глубина рекурсии не достигнет 7. Как-то так:
function sub7(left, right, level, depth) {
$list = список прямых потомков (`left_branch` >= :left_key AND `right_branch` <= :right AND `level` = :level+1);
foreach($list as $item) {
echo "<li>{$item['name']}";
if (depth < 7) {
echo "<ul>";
sub7($item['left'], $item['right'], $item['level'], $depth+1);
echo "</ul>";
}
}
}
echo "Команда:<ul>";
sub7($current_user_left, $current_user_right, $current_user_level, 0);
echo "</ul>"