#1 17.09.08 15:15
[mysql] Нужна в помощь в проектирование бд для создание френдленты
Задача первоначально кажется простой: нужно сделать возможность пользователям сайта "дружить" между собой, образовывая свою френдленту (круг друзей на сайте). Казалось бы можно сделать таблицу с полями id_user (id пользователя) id_friend (id друга пользователя с id_user) и сделать индекс на id_user. Но ,например, если взять 50 пользвотелей, и допустить что все они "между собой дружат" то получится 2500 записей, что как бы, мне кажется, не очень хорошо. Можно сделать поля id_user и id_friends_array,где будем хранить id пользователя и сериалайз массива из id его друзей. Но при выборке будет гемморой и связи не проследить.
В общем , "ало,это Данила, Ай нид хелп"(с)
Offline
#3 17.09.08 16:45
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
это самое первое что пришло в голову, наверняка есть способ оптимальней.
зы: я бы не спрашивал и сделал первый вариант, но ,к примеру, когда мне раньше нужно было что либо каталогизировать используя мускул,я делал просто: таблица c полями category_name, category_id, category_pid где id и pid были связкой, но вот недавно узнал про nested sets и оказалось что это можно сделать намного проще,причём выборка/удаление/получение пути прям реально проще выходят.
Offline
#4 17.09.08 17:00
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
iDrum написал(а):
если взять 50 пользвотелей, и допустить что все они "между собой дружат" то получится 2500 записей
ваще-то 2450... никто же из них сами себя не будут во френдленту добавлять :) такая схема БД используется в jabberd2... т.е. так называемый ростер храниться в отдельной таблице в такой вот связке овнер -> джит... ну, там еще опции вские о взимосвязи, группы в ростере, разрешения сообщений в обе стороны...
Offline
#5 17.09.08 20:55
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
ИМХО в 2 раза можно уменьшить количество записей. делаем поля в таблице id_user и id_user2. Пишем только одну запись друзей. То есть если пользователь один в друзья у пользователя 2, то не надо добавлять запись "1 2" и "2 1". Достаточно только одной, но при выборе друзей из таблицы надо писать не "SELECT FROM friends WHERE id_user=$userid", а "SELECT FROM friends WHERE id_user=$userid OR id_user2-$userid". НО при таком варианте надо проверять в каком поле айди друга, а не самого пользователя. То есть ты получаешь данные в переменные из БД. например в $id_usr1 и $id_usr2. Изначально имеем $userid чтобы выбирать друзей именно нужного пользователя. Потом простое условие if ($id_usr1==$userid) {$friend=$id_usr2;} else {$friend=$id_usr1;};
В итоге получаем в переменной friend айди друга. Конечно это в цикл, чтобы обработать все записи. Обработка замудреннее, но если требуется уменьшить размер БД то сойдет. ИМХО.
Offline
#6 17.09.08 21:17
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
Конечно это в цикл, чтобы обработать все записи.
бред....
Базу данных надо проектировать таким образом, чтобы одним (хоть и навороченным) запросом вытащить все нужные данные, даже ценой избыточности, а в пхп ее уже потом просто отображать.
В принципе таблица тут получается простая, большое колличество записей с использованием индексов тормозов не вызовет точно, зато время выполнение будет низкое - потому самое оптимальное, Imho- 1 вариант.
у меня в проекте используется подобная таблица, в которой уже 400 000 записей - mysql и запросы написаные оптимально, извлекают данные меньше чем за сотую секунды.
А экономить место на таких вещах усложнением программного кода - не рационально имхо...
Offline
#7 17.09.08 23:14
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
купи серверы сан майкросистемс =)))
Offline
#10 18.09.08 00:32
#11 18.09.08 09:21
#12 22.09.08 22:48
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
Jaguar написал(а):
гоните, батенька... т.е. добавил меня кто-то в друзья, и он у меня в друзьях светится? вот оно счастье спамщика?
ну можно же добавить поле к примеру `confirmed` если нет согласия - ну и нет значит дружбы:)
Offline
#13 23.09.08 09:21
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
"Согласны ли Вы взять этого пользователя в друзья и жить с ним в мире и согласии, пока смерть сервера не разлучит Вас?"
:)
А вообще Antony прав, так и делаются подобные вещи, по крайней мере так делаю всегда я. Но у меня не просто confirmed(boolean). Я делаю поле, в котором указывается тип связи типа SET ('friend', 'ignore', 'baned') что-то типа такого, если поле имеет значение, то связь подтверждена, если нет, то ждём. Если пользователь с которым хотят дружить не хочет этого, то удаляем запись. Всё довольно прозрачно.
Offline
#14 23.09.08 10:26
Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты
A-Lex, ну, а если рассматривать блоги, то получается, что надо делать тогда дополнительную фаворитленту... например, у меня во френдленте два писателя-фантаста и "Я" читаю "ЕГО БЛОГ"... ясный пень, что я ему в друзьях нахрен не сдался... но он так же может закрыть мне доступ... а если не будет его у меня во френдленте, то я не буду видеть его в "новостях от друзей"... т.е. дополнительный геморой с получением информации... т.е. в лучшем случае вы таким образом говорите юзеру, что "либо друзья, либо юзай закладки своего браузера"... тогда нахер такая френдлента? для спец.служб? чтобы точно знать кто же для тебя друг, а кто враг?
Исправлено Jaguar (23.09.08 10:26)
Offline

