Объясните как это сделано?

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
На примере "Вконтакте": Есть у них удобная функция в профиле:
> Разрешить комментировать фото: Всем, Только друзьям, Друзьям и друзьям друзей
> Разрешить писать на стене: Всем, Только друзьям, Друзьям и друзьям друзей
Ну и берешь, выбираешь из трех вариантов подходящий.
С первым и вторым мне понятно, как это организовано. Как-то так:
Если выбран первый вариант, то ничего не делаем и выводим на страницу форму для добавления комментов.
Если второй вариант, то ищем себя в друзьях у пользователя, чью фото хотим комментировать и если находим себя, то выводим на страницу форму добавления, иначе отказываем в добавлении.
А вот третий вариант как сделать?
Это надо взять каждого друга в друзьях у того, чью фото хотим комментировать и циклами сканировать в их друзьях, есть ли я у них в друзьях или нет. это же тысячи запросов, если друзей много.. Или как делать?
Сам принцип работы скрипта нужно, его структуру. Есть у кого какие мысли?
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Я думаю, то тут немного проще.

У каждого человека есть поле, в котором перечислены все друзья, например по ID.
Так же, наверняка, время от времени (а может и сразу при изменение друзей идет синхронизация) происходит некая синхронизация еще одного поля "Друзья друзей".
Т.е. именно в твой профиль заносятся эти друзья друзей.

Вот скрипт просто обращается к этим данным. Да много запросов, но не смертельно в масштабах ВК.

Именно по этой же схеме и происходит "Вы можете знать этих людей".

Возможно даже есть и третий уровень. )))

Так же может быть еще проще - многомерный массив, который там и пишется в БД
типа такого, наобум пишу (цифра это ID)
Код:
123(43,2554,32,85),143(62,345),64(90,127,916,765,7649),
Тут можно сразу и третью и большую вложенность делать.

Есть какой то специальный тип записи распространенный, во многих движках используется, например в WP
типа такого
Код:
a:6:{i:0;s:10:"postcustom";i:1;s:16:"commentstatusdiv";i:2;s:11:"commentsdiv";i:3;s:7:"slugdiv";i:4;s:9:"authordiv";i:5;s:12:"revisionsdiv";}
Думаю это лучше объяснят кто работал с подобным.
 

A-F

Well-Known Member
Регистрация
25.07.2011
Сообщения
390
А может у каждого пользователя есть табличка друзья и все.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
А может у каждого пользователя есть табличка друзья и все.
А вот третий вариант как сделать? Это надо взять каждого друга в друзьях у того, чью фото хотим комментировать и циклами сканировать в их друзьях, есть ли я у них в друзьях или нет. это же тысячи запросов, если друзей много.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Я думаю, то тут немного проще.

У каждого человека есть поле, в котором перечислены все друзья, например по ID.
Так же, наверняка, время от времени (а может и сразу при изменение друзей идет синхронизация) происходит некая синхронизация еще одного поля "Друзья друзей".
Т.е. именно в твой профиль заносятся эти друзья друзей.

Вот скрипт просто обращается к этим данным. Да много запросов, но не смертельно в масштабах ВК.

Именно по этой же схеме и происходит "Вы можете знать этих людей".

Возможно даже есть и третий уровень. )))

Так же может быть еще проще - многомерный массив, который там и пишется в БД
типа такого, наобум пишу (цифра это ID)
Код:
123(43,2554,32,85),143(62,345),64(90,127,916,765,7649),
Тут можно сразу и третью и большую вложенность делать.

Есть какой то специальный тип записи распространенный, во многих движках используется, например в WP
типа такого
Код:
a:6:{i:0;s:10:"postcustom";i:1;s:16:"commentstatusdiv";i:2;s:11:"commentsdiv";i:3;s:7:"slugdiv";i:4;s:9:"authordiv";i:5;s:12:"revisionsdiv";}
Думаю это лучше объяснят кто работал с подобным.
Спасибо, примерно так понял, как работает. Но воплощать что-то подобное перехотелось гг Обойдутся и без "Друзья друзей" :)
А как такой массив обрабатывать?
Код:
123(43,2554,32,85),143(62,345),64(90,127,916,765,7649),
В смысле как его разделить на составные части для проверки.. Что бы потом добавить в его конец что-то или же, наоборот, удалить какой-то id?

А может у каждого пользователя есть табличка друзья и все.
Если на каждого пользователя делать по таблице, то в бд будут только таблицы с друзьями.
Уж лучше тогда сделать одну таблицу, типа этой:
Код:
[id] [id_login] [id_drug]
Банру, а может и сделать такой вариант? Например, я хочу откомментировать твое фото, но меня нет у тя в друзьях и у тя стоит комментирование "Друзьям и Друзьям друзей"
Таблица table
Код:
[id] [id_login] [id_drug]
Берем всех твоих друзей:
$to_id - твой id логин;
$my_id - мой id логин;
Код:
$sql="select * from `table` where `id_login`='$to_id'";
Собираем все id_login твоих друзей в один массив:
Код:
while($mas=mysql_fetch_accoss){
$massiv[]=$mas['id_login'];
}
Теперь просто ищем меня в друзьях твоих друзей
Код:
"select * from `table` where `id_login` in (".implode(',', $massiv).") and `id_drug`='$my_id'";
если нашлось больше 1 строки то даем форму на добавление комментариев, а если нет, то пишем, что комментировать могут только друзья и друзья друзей
Возможны ошибки, но суть, думаю, понятна.
 

czp

czp
Регистрация
05.06.2011
Сообщения
635
а вы что соц сеть делаете?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
а вы что соц сеть делаете?
Я браузерную игру делаю... Но т.к в игре обязательно должно присутствовать общение, то приходится делать и соц.сервисы:) Чат, форум, письма, друзья и остальное..
 

czp

czp
Регистрация
05.06.2011
Сообщения
635
на какую тему?
 

A-F

Well-Known Member
Регистрация
25.07.2011
Сообщения
390
Ну и что если будет на каждого пользователя своя таблица, размер ее будет такой же. Скорость при этом не упадет, и ведь можно кешировать.

Сейчас работая над соц.игрой у нас есть таблица в которой порядка 10 000 000 записей... разделяем :)
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
В смысле как его разделить на составные части для проверки.. Что бы потом добавить в его конец что-то или же, наоборот, удалить какой-то id?
Я просто пример привел логический, а не практический, чтобы суть передать.
Как делать правильнее или удобнее - смотри и думай сам. Думаю и ответы есть в инете по запросы типа "массивы в БД"
Менять или удалять/добавлять - PHP=>массивы. Там функции и удаления и добавления есть.

Уж лучше тогда сделать одну таблицу, типа этой:
Ну дык, я про это примерно и говорю.
А отдельно хранить, в отдельно таблице или ячейку просто добавить - это дело вкуса.

Вроде разговор о том же только с боку или я не догоняю.
Да кстати, подобное по поиску я когда то делал кому то
http://demo.g63.ru/array_search.php
Что-то из этой вроде оперы.
 

A-F

Well-Known Member
Регистрация
25.07.2011
Сообщения
390
Если добавлять постоянно ячейки то будет большой не структурированный хлам
 

AngelGabriel

И имя мне - легион
Регистрация
23.11.2008
Сообщения
778
не зря стоит лимит на 10 000 друзей,
я думаю все завязано на общем друге, не нужно никаких массивов с друзьями друзей и прочих таблиц, просто условно говоря когда ваш НЕдруг хочет прокомментировать что-то, то он (скрипт) сравнивает друзей НЕдруга с вашими друзьями и если есть совпадения то "валяй троллить в коментах". Можно использовать простую функцию array_diff(),а результат кешировать, но у ВК своя собственная СУБД и хрен его знает как они это организовали у себя.

И еще меня тревожит мысль о сравнении двух массивов по 10000 элементов каждый, здесь нужно ОБЯЗАТЕЛЬНО вести сравнение до первого совпадения.


Я может ерунду написал, извиняюсь) ДА И ЕЩЕ, зеленым обозначены не друзья друзей, а друзья друзей друзей!!
 

AngelGabriel

И имя мне - легион
Регистрация
23.11.2008
Сообщения
778
интересная тема я аж под задумался)
Adanos, по моему в твоем варианте многовато итераций циклов будет, например ВК считаем по максимуму, у меня 10000 друзей и них у всех по 10000, перебор будем проводить до первого совпадения и тут уже не факт, что сразу нарвемся на нужную запись, а ее вобще может и не быть. В моем варианте просто сравниваем два массива.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Я может ерунду написал, извиняюсь) ДА И ЕЩЕ, зеленым обозначены не друзья друзей, а друзья друзей друзей!!
Не, вы не правы.
Например я хочу откомментить фото Банру, но меня нет в его друзьях. Значит я не смогу комментить, верно? Верно!
Тогда мы берем всех его друзей и ищем меня в них и если я там есть, то даем добро на комментирвоание. А если нет меня у его друзей в списках, то отказываем.
А у вас получается, что мы будем искать меня не только в друзьях Банру и друзьях, которые есть у НЕГО, но ещё и в друзьях, которые есть у друзей Банру.
И так пойдет по цепочке: Друзья Банру - Друзья его друзей, друзья друзей и так будет бесконечно, и 100% я найдусь у кого-нить в друзьях.
А Вконтакте, если я не ошибаюсь, сделано, что комментировать могут только друзья и друзья моих друзей т.е только те, который есть в друзьях у МОИХ друзей.
Adanos, по моему в твоем варианте многовато итераций циклов будет, например ВК считаем по максимуму, у меня 10000 друзей и них у всех по 10000, перебор будем проводить до первого совпадения и тут уже не факт, что сразу нарвемся на нужную запись, а ее вобще может и не быть. В моем варианте просто сравниваем два массива.
Каким перебором? о_О Одним запросом ищем "меня (того, кто хочет комментить чью-то фото" в друзьях автора фотки и всё) если находится больше 1 строки, значит я есть у кого то там в друзьях.. а если нет, то нет..
Фентези. Эльфы, орки и т.д.. Пока занимаюсь соц.сервисами в игре, потом плотно займусь PVE и уж потом PVP. Хочу сделать что-то типа игры "WoW", но в текстовом виде. Сложно одному всё делать, особенно придумывать название оружия, квесты. И времени маловато :( Это будет, пожалуй, ещё одно хобби.
 

AngelGabriel

И имя мне - легион
Регистрация
23.11.2008
Сообщения
778
А у вас получается, что мы будем искать меня не только в друзьях Банру и друзьях, которые есть у НЕГО, но ещё и в друзьях, которые есть у друзей Банру.
Ты совсем не понял мой способ, тебя мы вобще нигде не ищем, СРАВНИВАЮТСЯ ДВА СПИСКА ДРУЗЕЙ, ТВОЙ и ЧЕЛОВЕКА КОТОРОГО ТЫ ХОЧЕШЬ КОМЕНТИТЬ, если есть совпадения то дерзай.

Читай внимательней ,то что я написал выше.

ищем "меня (того, кто хочет комментить чью-то фото" в друзьях автора фотки и всё)
запрос жирнючий, приведи пример
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
Ты совсем не понял мой способ, тебя мы вобще нигде не ищем, СРАВНИВАЮТСЯ ДВА СПИСКА ДРУЗЕЙ, ТВОЙ и ЧЕЛОВЕКА КОТОРОГО ТЫ ХОЧЕШЬ КОМЕНТИТЬ, если есть совпадения то дерзай.
Как получится два? Первый массив - это все мои друзья, второй массив - это друзья чела, которого хочу откомментить. А где массив с "друзья друзей" этого человека?
Если так елать, то берем по максимому, сравнивая массивы:
Мой массив: 10.000 друзей
Друзья чела, чье фото: 10.000 друзей
У этих друзей чела, чье фото ещё по 10.000 друзей у каждого.
Это будет такой массив: 10.000+10.000*10.000
Придется искать совпадения в массивах из 10к записей и 100.010.000 записей. 100 лямов друзей, перебором првоерять с массивом 10к это будет оч ресурсоемко и долго. Или не?
запрос жирнючий, приведи пример
При 10к друзей, то да, запрос будет большой. И вообще может не сработать даже, наверное.
 

AngelGabriel

И имя мне - легион
Регистрация
23.11.2008
Сообщения
778
НЕТ люди объясните ему,
У этих друзей чела, чье фото ещё по 10.000 друзей у каждого.
нафига нам друзья друзей чела

if (ТВОИ друзья сравнить ЕГО друзья) есть совпадения {
можно коментить
} else {иди лесом}

вот она, функция которая тебе нужна
http://www.php.net/manual/ru/function.array-intersect.php
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
НЕТ люди объясните ему,
У этих друзей чела, чье фото ещё по 10.000 друзей у каждого.
нафига нам друзья друзей чела

if (ТВОИ друзья сравнить ЕГО друзья) есть совпадения {
можно коментить
} else {иди лесом}
А, ну так бы сразу и сказал! А то я сперва подумал, что ты ещё и хоч взять друзей его друзей :) Ну по 10к сравнить массивы будет попроще, но один фиг, массивы по 10к записей это не мало) На крайняк, на первое время можно ограничить по 1к записи. Потом уже думать о улучшении, когда наберет обороты сайт до таких масштабов. Плюсанул те за умную мыслю :)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ