Официальный сайт студ.городка НГТУ
Программирование и БД » [mysql] Нужна в помощь в проектирование бд для создание френдленты 

#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

#2  17.09.08 16:29

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

iDrum написал(а):

Но ,например, если взять 50 пользвотелей, и допустить что все они "между собой дружат" то получится 2500 записей, что как бы, мне кажется, не очень хорошо.

это нормально

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

HIN
Профиль

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

Igo
Профиль

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

Конечно это в цикл, чтобы обработать все записи.

бред....

Базу данных надо проектировать таким образом, чтобы одним (хоть и навороченным) запросом вытащить все нужные данные, даже ценой избыточности, а в пхп ее уже потом просто отображать.

В принципе таблица тут получается простая, большое колличество записей с использованием индексов тормозов не вызовет точно, зато время выполнение будет низкое - потому самое оптимальное, Imho- 1 вариант.
у меня в проекте используется подобная таблица, в которой уже 400 000 записей - mysql и запросы написаные оптимально, извлекают данные меньше чем за сотую секунды.

А экономить место на таких вещах усложнением программного кода - не рационально имхо...

Offline

#7  17.09.08 23:14

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

купи серверы сан майкросистемс =)))

Offline

#8  17.09.08 23:56

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

HIN написал(а):

то не надо добавлять запись "1 2" и "2 1".

гоните, батенька... т.е. добавил меня кто-то в друзья, и он у меня в друзьях светится? вот оно счастье спамщика?

Offline

#9  18.09.08 00:21

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

Jaguar, на этот случай можно апрув сделать, но всё равно пока 1ый способ лучше

Offline

#10  18.09.08 00:32

HIN
Профиль

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

гоните, батенька... т.е. добавил меня кто-то в друзья, и он у меня в друзьях светится? вот оно счастье спамщика?

В друзья чтобы добавить должно быть согласие второй стороны.
Хотя согласен что 1й способ лучше.

Offline

#11  18.09.08 09:21

Re: [mysql] Нужна в помощь в проектирование бд для создание френдленты

HIN написал(а):

должно быть согласие второй стороны.

по примеру ЖЖ - далеко не обязательно...

Offline

#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

Программирование и БД » [mysql] Нужна в помощь в проектирование бд для создание френдленты 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.044 сек.
Выполнено 14 запросов.