user_friends (
id integer autoincrement,
user integer,
user_friend integer
)
Определение удаленности дружбы пользователя (вопрос такой)
Голова не очень сейчас соображает, поэтому обращаюсь к кому-нибудь.
Хотелось бы реализовать средствами SQL (делаю на PostgreSQL, но по сути в принципе неважно на чем).
Многие знают такие соцсети, как ВКонтакте, МойКруг. Туда же еще можно добавить XING и LinkedIn.
В них (вконтакте вроде не делает предоставляет такую функцию) имеется функция определения круга друзей (удаленность по друзьям пользователя Б от пользователя А).
Чтобы было понятнее, на живом примере. Имеем следующие связи:
1. Вася дружит с Петей.
2. Петя дружит с Колей.
3. Коля дружит с Машей.
4. Маша дружит с Галей.
В БД это выражается следующим образом. Имеется табличка:
Код:
Где
- id - это просто идентификатор связи
- user - идентификатор исходного пользователя
- user_friend - идентификатор пользователя, являющегося другом
Каждый факт дружбы имеет две связи. Например: дружба Васи с Петей в таблице записывается так:
- Вася дружит с Петей.
- Петя дружит с Васей.
Т.е. дружба двухсторонняя, односторонней дружбы как ЖЖ нет.
Далее.
Предположим, что Вася ищет пользователей. Ему отображается список пользователей и возле каждого из них нужно проставить циферку, в каком кругу друзей от Васи находится каждый пользователь. Как в МойКруг.ру.
Вася нашел всех пользователей:
1. Петя (1 круг)
2. Коля (2 круг)
3. Маша (3 круг)
4. Галя (за пределами третьего круга)
Т.е. т.к. Вася напрямую дружит с Петей, то Петя находится в первом кругу друзей Васи.
Петя дружит с Колей и Васей, но Коля не является прямым другом Васи, значит Коля находится во втором кругу друзей Васи.
Коля дружит с Машей, и, если Маша не является непосредственным другом Васи, то она находится в третьем круге друзей Васи.
Галя дружит с Машей, но не дружит с Васей, значит она находится за пределами третьего круга друзей Васи.
Вот такая вот механика.
Очень нужно придумать, как определять удаленность дружбы пользователей средствами SQL. Т.е. я могу, конечно, сначала выбрать всех пользователей, потом передать их информацию в программу, далее программа начинает своими силами определять удаленность друзей, периодически обращаясь к БД... Но это слишком уж ресурсоемко. Если нужно будет вывести список из 150 пользователей, то на определение удаленности каждого пользователя придется выполнять SQL-запрос из программы, то многовато запросов получается.
Поэтому хочется иметь возможность использовать такую конструкцию:
Код:
SELECT
user_id,
user_name,
(...что-то здесь...) AS friend_range
FROM
users
.....
user_id,
user_name,
(...что-то здесь...) AS friend_range
FROM
users
.....
таблица пользователей и подчиненная таблица связей
для определения вложенности связи делать рекурсивную выборку по таблице связей (т.е. сколько выдаст записей, такова и будет вложенность "дружбы")
Мы имеем две таблицы: одна таблица пользователей, другая таблица связей между пользователями. Но я не понял про рекурсивную выборку и количество записей.
Цитата: noff
Не понял.
Мы имеем две таблицы: одна таблица пользователей, другая таблица связей между пользователями. Но я не понял про рекурсивную выборку и количество записей.
Мы имеем две таблицы: одна таблица пользователей, другая таблица связей между пользователями. Но я не понял про рекурсивную выборку и количество записей.
это получается некое "дерево" связей, где могут быть как иерархические связи, так исвязи одного уровня.
Здесь по сайту поищи "Рекурсия в SQL" так же погугли...
просто нет времени щас конкретный пример писать
в конце статьи пример с городами, думаю самое оно