Покинул форум
Сообщений всего: 134
Дата рег-ции: Февр. 2012 Откуда: Тольятти
Помог: 2 раз(а)
[+]
Всем доброго времени суток.
Стоит задача:
думаю легче объяснить так что бы все поняли, все мы знаем наш любимый и не очень, "вконтакте". Допустим если вы заходите на страничку к какому нибудь человеку - не знакомому, появляется кнопочка ниже авы, "добавить в друзья" , а если вы заходите к своему другу то вместо этого появляется "отправить сообщение"
у меня практическая аналогичная задача, есть таблица в базе со всеми "друзьями"
есть несколько вариантов как сделать эту казалось бы простую проверку
1) (самый ресурсоёмкий) каждый раз находить всех друзей в базе и если такого id нет то писать "добавить в друзья" иначе же это друг и выводить "отправить сообщение"
сами понимаете, если допустим всего в сети 1000 человек то перекрёстно это очень много запросов
2) изначально к каждому профилю привязывать файл(текстовый) и хранить там его друзей и получаем как минимум в 10 раз больше приемущества (я так думаю, чем меньше запросов тем лучше)
3) хранить в таблице самого профиля массив со всеми твоими друзьями (в принципе тоже не совсем накладно)
4) использовать кэширование, запрос со всеми твоими друзьями из базы вытащил и в кэш(оперативку сервера засунул)
Помогите пожалуйста, может у кого свой вариант есть, а то в голову не приходит что лучше, (учитывается то что ресурс будет высоко-средне нагруженным)
----- Самое лучшее решение проблемы самое простое
EuGen
Отправлено: 26 Апреля, 2013 - 18:35:38
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
0) Сделать таблицу user_friends, в которой хранить пары friend_0_id, friend_1_id - являющиеся ссылками на таблицу users. Тогда запрос потребуется ровно один.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 26 Апреля, 2013 - 18:38:15
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
какие проблеммы с запросом к таблице по индексному полю ?
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Есть таблица, в ней хранятся связи. В таблице есть индекс по каждой колонке и по двум колонкам (всего три). Запрос на поиск, есть ли в списке друзей указанный пользователь, будет использовать индексацию и потому будет выполняться быстро.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Medallion
Отправлено: 26 Апреля, 2013 - 21:21:07
Частый гость
Покинул форум
Сообщений всего: 253
Дата рег-ции: Май 2012 Откуда: Херсон, Украина
Помог: 7 раз(а)
Есть табличка пользователя, в котором есть поле friends.
В этой табличке хранить id каждого друга, тоесть идентификатор-логин.
Выбираем одним запросом массив данных этого поля, сверяем в цикле
каждый id с id-ом к кому зашли на страницу, если id совпали:
Выводим - "Отправить сообщение"
если нет:
Выводим - "Добавить в друзья"
Логика простая.
LIME
Отправлено: 26 Апреля, 2013 - 21:59:23
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Medallion по таблице на каждого юзера???
это как же потом с такой бд работать?
страшно представить этот список в инструменте
caballero
Отправлено: 26 Апреля, 2013 - 22:07:52
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Есть табличка пользователя, в котором есть поле friends.
В этой табличке хранить id каждого друга, тоесть идентификатор-логин.
я смотрю о соединении таблиц "многие-ко-многим" никто не слышал (Добавление)
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
LIME пишет:
Medallion по таблице на каждого юзера???
это как же потом с такой бд работать?
страшно представить этот список в инструменте
слишал об одном проекте типа укоза или что-то в етом роде. так они там вместо связей использовали таблицы. но там имхо было оправдано ибо обьем данных был значителен. но здесь ето зло в чистом его виде
caballero
Отправлено: 26 Апреля, 2013 - 23:35:39
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
так они там вместо связей использовали таблицы. но там имхо было оправдано ибо обьем данных был значителен.
скорее всего там каждый юзер сидел со своими данными в своей песочнице. Но даже в этом случае это не слишком оправдывает.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
esterio если значительно большим станет количество таблиц, то в проблему превратится поиск нужной таблицы
и поиск не индексированный заметь
бред со всех сторон
esterio
Отправлено: 26 Апреля, 2013 - 23:49:01
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
все верно. данные полностю разделены кроме юзеров.
я тоже поначало так думал. но если верить написаной ими же статти им удалось таким методом добится лучших результатов. собственно там били замеры. жаль ссилку не брошу так как не помню
LIME
Отправлено: 26 Апреля, 2013 - 23:54:41
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
ты уверен что не о вертикальном разделении сейчас говоришь?
esterio
Отправлено: 27 Апреля, 2013 - 00:00:58
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
в общем на чем они аииграли
1. данние разделены а значит и join- ить ничего не нужно на равне с union
2. префиксы таблиц легко подставить в запрос при правильном проектировании
3. диапазон виборки сужается из за того что нету данных чужого пользака
4. лок проходит только на таблицу пользака. а ето означакт что другие юзеры успешно пользуются своими данными (Добавление) LIME
да уверен. база одна и сервер также. никаких репликаций как они заверяли (Добавление)
но ето скорее исключительнпя ситуация. для повишения производительности все таки лучше использовать кластеры, репликацию, кеширование и прочую лабуду. да и редко проект состоит из полностю разделяемых данных где связи не нужны.
caballero
Отправлено: 27 Апреля, 2013 - 00:17:56
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
в общем на чем они аииграли
1. не очень понимаю каким боком тут join ?
если разделение юзеров не означает что вообще отсутствуют реляционные отношения и все данные юзера тупо сваливаются в одну таблицу
2 id юзера для индексного поля еще проще
3. для отбора опять же по индексному ключу несущественно
4. не знаю в каком году это писалось и для какой БД (может для DBF ?) но нынешняя mysql вроде как блокирует на уровне страницы а не на уровне таблицы.
да и вообще сейчас кагбэ партицирование поддерживается и все такое.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.