Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Определение удаленности дружбы пользователя (вопрос такой)

6.6K
20 января 2008 года
noff
67 / / 01.08.2006
Здравствуйте.

Голова не очень сейчас соображает, поэтому обращаюсь к кому-нибудь.
Хотелось бы реализовать средствами SQL (делаю на PostgreSQL, но по сути в принципе неважно на чем).

Многие знают такие соцсети, как ВКонтакте, МойКруг. Туда же еще можно добавить XING и LinkedIn.

В них (вконтакте вроде не делает предоставляет такую функцию) имеется функция определения круга друзей (удаленность по друзьям пользователя Б от пользователя А).

Чтобы было понятнее, на живом примере. Имеем следующие связи:

1. Вася дружит с Петей.
2. Петя дружит с Колей.
3. Коля дружит с Машей.
4. Маша дружит с Галей.

В БД это выражается следующим образом. Имеется табличка:
 
Код:
user_friends (
    id integer autoincrement,
    user integer,
    user_friend integer
)


Где
- id - это просто идентификатор связи
- user - идентификатор исходного пользователя
- user_friend - идентификатор пользователя, являющегося другом

Каждый факт дружбы имеет две связи. Например: дружба Васи с Петей в таблице записывается так:
- Вася дружит с Петей.
- Петя дружит с Васей.
Т.е. дружба двухсторонняя, односторонней дружбы как ЖЖ нет.

Далее.

Предположим, что Вася ищет пользователей. Ему отображается список пользователей и возле каждого из них нужно проставить циферку, в каком кругу друзей от Васи находится каждый пользователь. Как в МойКруг.ру.

Вася нашел всех пользователей:
1. Петя (1 круг)
2. Коля (2 круг)
3. Маша (3 круг)
4. Галя (за пределами третьего круга)

Т.е. т.к. Вася напрямую дружит с Петей, то Петя находится в первом кругу друзей Васи.
Петя дружит с Колей и Васей, но Коля не является прямым другом Васи, значит Коля находится во втором кругу друзей Васи.
Коля дружит с Машей, и, если Маша не является непосредственным другом Васи, то она находится в третьем круге друзей Васи.
Галя дружит с Машей, но не дружит с Васей, значит она находится за пределами третьего круга друзей Васи.

Вот такая вот механика.

Очень нужно придумать, как определять удаленность дружбы пользователей средствами SQL. Т.е. я могу, конечно, сначала выбрать всех пользователей, потом передать их информацию в программу, далее программа начинает своими силами определять удаленность друзей, периодически обращаясь к БД... Но это слишком уж ресурсоемко. Если нужно будет вывести список из 150 пользователей, то на определение удаленности каждого пользователя придется выполнять SQL-запрос из программы, то многовато запросов получается.

Поэтому хочется иметь возможность использовать такую конструкцию:
 
Код:
SELECT
    user_id,
    user_name,
    (...что-то здесь...) AS friend_range
FROM
    users
.....
11
20 января 2008 года
oxotnik333
2.9K / / 03.08.2007
самое простое что приходит на ум:
таблица пользователей и подчиненная таблица связей
для определения вложенности связи делать рекурсивную выборку по таблице связей (т.е. сколько выдаст записей, такова и будет вложенность "дружбы")
6.6K
20 января 2008 года
noff
67 / / 01.08.2006
Не понял.

Мы имеем две таблицы: одна таблица пользователей, другая таблица связей между пользователями. Но я не понял про рекурсивную выборку и количество записей.
11
20 января 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: noff
Не понял.

Мы имеем две таблицы: одна таблица пользователей, другая таблица связей между пользователями. Но я не понял про рекурсивную выборку и количество записей.



это получается некое "дерево" связей, где могут быть как иерархические связи, так исвязи одного уровня.
Здесь по сайту поищи "Рекурсия в SQL" так же погугли...
просто нет времени щас конкретный пример писать
в конце статьи пример с городами, думаю самое оно

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог