Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: алгоритм

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: проверка
imper
Отправлено: 26 Апреля, 2013 - 18:27:36
Post Id



Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Февр. 2012  
Откуда: Тольятти


Помог: 2 раз(а)

[+]


Всем доброго времени суток.

Стоит задача:
думаю легче объяснить так что бы все поняли, все мы знаем наш любимый и не очень, "вконтакте". Допустим если вы заходите на страничку к какому нибудь человеку - не знакомому, появляется кнопочка ниже авы, "добавить в друзья" , а если вы заходите к своему другу то вместо этого появляется "отправить сообщение"

у меня практическая аналогичная задача, есть таблица в базе со всеми "друзьями"
есть несколько вариантов как сделать эту казалось бы простую проверку

1) (самый ресурсоёмкий) каждый раз находить всех друзей в базе и если такого id нет то писать "добавить в друзья" иначе же это друг и выводить "отправить сообщение"
сами понимаете, если допустим всего в сети 1000 человек то перекрёстно это очень много запросов

2) изначально к каждому профилю привязывать файл(текстовый) и хранить там его друзей и получаем как минимум в 10 раз больше приемущества (я так думаю, чем меньше запросов тем лучше)

3) хранить в таблице самого профиля массив со всеми твоими друзьями (в принципе тоже не совсем накладно)

4) использовать кэширование, запрос со всеми твоими друзьями из базы вытащил и в кэш(оперативку сервера засунул)

Помогите пожалуйста, может у кого свой вариант есть, а то в голову не приходит что лучше, (учитывается то что ресурс будет высоко-средне нагруженным)


-----
Самое лучшее решение проблемы
самое простое
 
 Top
EuGen Администратор
Отправлено: 26 Апреля, 2013 - 18:35:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




0) Сделать таблицу user_friends, в которой хранить пары friend_0_id, friend_1_id - являющиеся ссылками на таблицу users. Тогда запрос потребуется ровно один.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 26 Апреля, 2013 - 18:38:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




какие проблеммы с запросом к таблице по индексному полю ?

(Отредактировано автором: 26 Апреля, 2013 - 18:38:30)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
imper
Отправлено: 26 Апреля, 2013 - 18:52:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Февр. 2012  
Откуда: Тольятти


Помог: 2 раз(а)

[+]


EuGen, я немного не догнал можно немного поподробнее?

у меня есть таблица friends_iv всех друзей id id_user id_user_friend
если я не ошибаюсь то вы тоже самое имели ввиду?!

(Отредактировано автором: 26 Апреля, 2013 - 18:55:49)



-----
Самое лучшее решение проблемы
самое простое
 
 Top
EuGen Администратор
Отправлено: 26 Апреля, 2013 - 19:00:57
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Есть таблица, в ней хранятся связи. В таблице есть индекс по каждой колонке и по двум колонкам (всего три). Запрос на поиск, есть ли в списке друзей указанный пользователь, будет использовать индексацию и потому будет выполняться быстро.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Medallion
Отправлено: 26 Апреля, 2013 - 21:21:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Май 2012  
Откуда: Херсон, Украина


Помог: 7 раз(а)




Есть табличка пользователя, в котором есть поле friends.
В этой табличке хранить id каждого друга, тоесть идентификатор-логин.
Выбираем одним запросом массив данных этого поля, сверяем в цикле
каждый id с id-ом к кому зашли на страницу, если id совпали:
Выводим - "Отправить сообщение"
если нет:
Выводим - "Добавить в друзья"

Логика простая.
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 21:59:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Medallion по таблице на каждого юзера???
это как же потом с такой бд работать?
страшно представить этот список в инструменте
 
 Top
caballero
Отправлено: 26 Апреля, 2013 - 22:07:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Есть табличка пользователя, в котором есть поле friends.
В этой табличке хранить id каждого друга, тоесть идентификатор-логин.

я смотрю о соединении таблиц "многие-ко-многим" никто не слышал
(Добавление)
Цитата:
Логика простая.

если не учитывать что логики никакой нет вообще


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 26 Апреля, 2013 - 23:30:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




LIME пишет:
Medallion по таблице на каждого юзера???
это как же потом с такой бд работать?
страшно представить этот список в инструменте

слишал об одном проекте типа укоза или что-то в етом роде. так они там вместо связей использовали таблицы. но там имхо было оправдано ибо обьем данных был значителен. но здесь ето зло в чистом его виде
 
 Top
caballero
Отправлено: 26 Апреля, 2013 - 23:35:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
так они там вместо связей использовали таблицы. но там имхо было оправдано ибо обьем данных был значителен.

скорее всего там каждый юзер сидел со своими данными в своей песочнице. Но даже в этом случае это не слишком оправдывает.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 23:36:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




esterio если значительно большим станет количество таблиц, то в проблему превратится поиск нужной таблицы
и поиск не индексированный заметь
бред со всех сторон
 
 Top
esterio
Отправлено: 26 Апреля, 2013 - 23:49:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




все верно. данные полностю разделены кроме юзеров.
я тоже поначало так думал. но если верить написаной ими же статти им удалось таким методом добится лучших результатов. собственно там били замеры. жаль ссилку не брошу так как не помню
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 23:54:41
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ты уверен что не о вертикальном разделении сейчас говоришь?
 
 Top
esterio
Отправлено: 27 Апреля, 2013 - 00:00:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




в общем на чем они аииграли
1. данние разделены а значит и join- ить ничего не нужно на равне с union
2. префиксы таблиц легко подставить в запрос при правильном проектировании
3. диапазон виборки сужается из за того что нету данных чужого пользака
4. лок проходит только на таблицу пользака. а ето означакт что другие юзеры успешно пользуются своими данными
(Добавление)
LIME
да уверен. база одна и сервер также. никаких репликаций как они заверяли
(Добавление)
но ето скорее исключительнпя ситуация. для повишения производительности все таки лучше использовать кластеры, репликацию, кеширование и прочую лабуду. да и редко проект состоит из полностю разделяемых данных где связи не нужны.
 
 Top
caballero
Отправлено: 27 Апреля, 2013 - 00:17:56
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
в общем на чем они аииграли

1. не очень понимаю каким боком тут join ?
если разделение юзеров не означает что вообще отсутствуют реляционные отношения и все данные юзера тупо сваливаются в одну таблицу

2 id юзера для индексного поля еще проще

3. для отбора опять же по индексному ключу несущественно

4. не знаю в каком году это писалось и для какой БД (может для DBF ?) но нынешняя mysql вроде как блокирует на уровне страницы а не на уровне таблицы.

да и вообще сейчас кагбэ партицирование поддерживается и все такое.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB