Строка предков с разделителями
Если вы строго рассматриваете 5-уровневую таблицу отношений, это может упростить использование строки предков с разделителями вместо 5 отдельных столбцов.
user_id depth ancestors
10 7 9,7,4,3,2,1
9 6 7,4,3,2,1
...
2 2 1
1 1 (empty string)
Вот некоторые команды SQL, которые вы бы использовали с этой моделью:
Чтобы добавить пользователя 11, по ссылке пользователя 10
insert into ancestors_table (user_id, depth, ancestors)
select 11, depth+1, concat(10,',',ancestors)
from ancestors_table
where user_id=10;
Чтобы найти всех пользователей, по ссылке пользователя 3. (Примечаниечто этот запрос не может использовать индекс.)
select user_id
from ancestors_table
where ancestors like '%,3,%' or ancestors like '3,%' or ancestors like '%,3';
Чтобы найти предков пользователя 10. Вам нужно разбить строку в вашей клиентской программе.В Ruby код будет ancestorscolumn.split(",").map{|x| x.to_i}
.Нет хорошего способа разбить строку в SQL.
select ancestors from ancestors_table where user_id=10;
Чтобы узнать количество пользователей на каждом уровне, указанное пользователем 3:
select
depth-(select depth from ancestors_table where user_id=3),
count(*)
from ancestors_table
where ancestors like '%,3,%' or ancestors like '3,%' or ancestors like '%,3'
group by depth;
Вы можете избежать внедрения SQLатакует на части like '%,3,%'
этих запросов, используя вместо этого like concat('%,', ?, ',%')
и привязывая целое число для номера пользователя к заполнителю.