Проэктирование БД

LONGMAN

Dark Side of the Moon..
Проэктирование БД

На серёзных сайтах как осушествлено добавление юзера в контактах другова юзера? Понятно что гдето в базе добавляется его id. Как лучше сделать это? В таблице users создать поле text и в нём хранить эти id разделяя на пример символом "|" или хранить массив с помошью serialize? Или вообше создать отдельную таблицу?
 

LONGMAN

Dark Side of the Moon..
Значит сделать такую таблицу?
PHP:
CREATE TABLE `friends` (
  `user_id` int(15) UNSIGNED NOT NULL default '0',
  `friend_id` int(15) UNSIGNED NOT NULL default '0',
  UNIQUE KEY  (`user_id`,`friend_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
 

LONGMAN

Dark Side of the Moon..
Спасибо большое. И об этом последный вопрос, если поставлю PRIMARY KEY (`user_id`,`friend_id`) то в этом запросе будет использовано PRIMARY KEY? Ведь ключ составной..
PHP:
SELECT * FROM `friends` WHERE `user_id` = $id
То есть будет работать быстро? P.S. EXPLAIN не предлагайте пожалуйста, ещё не разобрался в нём как следует.. :)
 

Heresy

Новичок
Да, выборка по первой колонке составного индекса будет быстрой.
 

findnext

Новичок
Ну сюда можно ещё и добавить условие при котором если друг полностью удаляется из бд, то чтобы удалялся из списков друзей тоже. ENGINE=InnoDB, ON DELETE CASCADE
 

LONGMAN

Dark Side of the Moon..
Можете подробнее об этом? И почему InnoDB, когда у меня таблицы MyISAM
 

pilot911

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

это поле используется для вывода в списке всех друзей без связывания таблиц (выборка по ID работает на порядок шустрее)

ПС. можно юзать и char(255) в качестве этого списка, ибо обычно на средней социалке максимальный ID юзера ~ 2-3 байта, и 70-100 друзей вполне хватает добавить в это поле
 

LONGMAN

Dark Side of the Moon..
Ведь итак можно вивести список ID всех друзей, зачем нужен char поле
PHP:
<?php
$friends = mysql_query("SELECT friend_id FROM friemds WHERE user_id='".$id."'");
while($friend = mysql_fetch_array($friends))
{
echo $friend[0].'<br/>';

}
?>
-~{}~ 04.03.09 18:16:

Какие ещё различие между MyISAM и InnoDB? Дайте пожалуйста ссылку где об этом почитать. На русском
 

LONGMAN

Dark Side of the Moon..
Вот следующий вопрос, как вывести Ники и ID тех друзей кто онлайн без цикла?
 

findnext

Новичок
LONGMAN
поподробнее можно? мне чего то не совсем понятно что ты имеешь ввиду
 

LONGMAN

Dark Side of the Moon..
Вот имеем таблицу users где хранится id, логины, пароли юзеров и т.д. и friends где хранится friend_id (id друга) и user_id (id юзера из таблицы users). Вот как вывести список онлайн друзей для юзера (на пример id=100) без цикла?
 
Сверху