проектировка структруры бд

ardentlyo

Новичок
проектировка структруры бд

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

моя идея создать в таблице юзеров новое поле и хранить там сериализированный массив айдишников юзеров=>статусов, где статус=добавлен_В_друзья|подал завявку на добалвение и т.д.

но както мне кажется, не очень правильно это!
 

Армян

Новичок
я бы сделал обычную таблицу с двумя айдишниками: user_id, friend_id
поля бы ссылались на ту же таблицу юзеров, и плюс все дополнительные поля которые нужны :)
 

ardentlyo

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

все-таки как будет более оптимально?
 

AHTIXPICT

Новичок
в плане быстродействия, все-таки мой вариант окажется быстрее...

Это еще нужно длказать а не просто так сказать
А если когда нибудь список друзей станет порядка 1000 и более
 

ardentlyo

Новичок
AHTIXPICT
я анализирую, и хочу услышать мнение других, как более оптимально сделать!
 

wildarp

Новичок
ябы тоже так сделал как Армян, помоему решение самое то
 

Армян

Новичок
насчет быстродействия может быть, но мне такие варианты никогда не нравились, т.к. там появляется ограничение на кол-во друзей.

Если очень важна скорость работы то тут нужно тестить и выбирать то что быстрее.
 

phprus

Moderator
Команда форума
ardentlyo
При наличии индексов вариант с дополнительной таблицей с полями user_id, friend_id будет значительно быстрее, так как проход СУБД по дереву индекса это гораздо более простая операция, чем десериализация большой строки интерпретатором PHP.
Когда количество друзей мало, то разница в скорости заметна практически не будет.

Кроме того вариант с дополнительной таблицей удобнее, так как к примеру позволяет реализовать функцию поиска тех юзеров у которых Я в друзьях одним запросом, а в случае с сериализованым полем, это реализуется на несколько порядков сложнее.

ведь в вашем вариенте, нужно просмотреть всю таблицу, выбрать из нее определенные поля - это и будет список френдов.
А вот это бред. Прочитай про B-деревья и про hash-таблицы, а именно так чаще всего индексы реализуют.
 

berkut

Новичок
так собсно всё зависит от того, шо с этими друзелями делать. в одном случае будет тормозить денормализованный вариант, а в другом наоборот. ваще лучше в отдельной таблице, а потом если чё дублировать в строку
 

Фанат

oncle terrible
Команда форума
в плане быстродействия, все-таки мой вариант окажется быстрее...
началось...
"у нас в детском саду из соплей такие скульптуры лепили! а вы мне говорите, что дом нельзя построить!"

-~{}~ 12.07.08 18:10:

комментарии, как всегда, жгут.
 

Bakti9rov

!*|=?
SQL:
SELECT * FROM users WHERE id IN(SELECT friend_id FROM user_friends WHERE user_id=1)
CREATE TABLE `user_friends` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
);
 

berkut

Новичок
phprus а в оракле тут однохтено. или я не прав? хотя форум мускл...
 

berkut

Новичок
CREATE TABLE `user_friends` (
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL,
UNIQUE KEY (`user_id`, friend_id)
);
 

Bakti9rov

!*|=?
phprus
ооо чувак, канешно. ;) по рассказам, ваще суперская вещь! %))

вложенный не отработает в четвертом мускл, а вообще я наверное тебе покажу кошерный запрос с джойнами:

SELECT users.*, user_friends.user_id AS friend_of FROM users LEFT JOIN user_friends ON user_friends.friend_id = users.id HAVING user_friends.user_id=1

Армян, Ты прав, да вот что-то у меня таблицы все автоматомом добавляются с id PRIMARY KEY, конечно он там не нужен :)
 

phprus

Moderator
Команда форума
Bakti9rov
а вообще я наверное тебе покажу кошерный запрос с джойнами:
Судя по твоему запросу про JOIN'ы тебе только рассказывали ибо использовать тут having ну вообще никакого смысла нету.

P.S. Кстати, а интересно как в таком запросе MySQL будет индексы использовать. А то наличие having вносит подозрения о возможности появления полного сканирования таблиц. Я прав или нет?
 
Сверху