Таблица для списка друзей

1. Вусал (16.02.2010 / 07:17)
Друзья, как правильно создать таблицу для списка друзей? Т.е. Из какие поля должны быть.?
Например. Юзер добавляет в друзья другого юзера.

2. Вусал (16.02.2010 / 07:19)
Хочу спросить как у вас состоят таблица друзей.

3. Андрей (16.02.2010 / 08:00)
Ну наверно так:
CREATE TABLE friends (friend1 BIGINT, friend2 BIGINT, who BIGINT, enjoyed int(1) default '0')
friend1-Ид юзера
friend2-Ид второго юзера
who-Ид приглашающего
enjoyed-Подтверждено приглашение или нет

4. Олег (16.02.2010 / 21:48)
who-Ид не зачем

5. Вусал (17.02.2010 / 21:01)
3. дОбрыЙ МоЛоЧниК, понятно

6. Анатолий (25.02.2010 / 21:55)
У меня для этого одна таблица
CREATE TABLE `friends`(
`id` INT NOT NULL AUTO_INCREMENT,
`str` TEXT,
PRIMARY KEY(id)
);
Формат строчки:
По дефолту (при создании записи) заполнено символами :;
При добавлении/удалении поиск по наличии :<id юзера>:,
а потом добавление или str_replace("$id:","",$str);
Таблица предолжений о дружбе существует отдельно, но работает по тому же принципу.

7. Олег (26.02.2010 / 11:41)
dek, хочешь сказать что всех друзей конкртеного юзера хранишь в одной строчке?

8. Анатолий (26.02.2010 / 14:34)
конечно

9. ramzes (26.02.2010 / 14:59)
id int(16) NOT NULL AUTO_INCREMENT, user int(11) NOT NULL, friend int(11) NOT NULL, time int(11), friend_type int(1) DEFAULT 0, PRIMARY KEY (id), KEY user (user), KEY friend (friend), KEY friend_type (friend_type)
user - юзер
friend - друг
time - дата добавления
friend_type - друг/враг/игнор

10. Игорь (26.02.2010 / 15:10)
9. ramzes, имхо самое правильное решение, у меня также, только без последнего столбца.
П.Сы. Спасибо за идеюsmile

11. Protus (26.02.2010 / 15:47)
теперь модно писать социальные сети?D

12. Олег (26.02.2010 / 16:08)
dek, неожидал от тебя вот четсно)

13. ramzes (26.02.2010 / 17:04)
#11 если «друзья» то сразу соц-сети? Железная логика))

14. Анатолий (26.02.2010 / 18:09)
12, на мой взгляд лучше взять строчку из БД по первичному кдючу и в ней с помощью РНР искать совпадение, чем пробегать селектом по всей базе smile ))
Гы, а чего от меня еще можно ожидать? D

15. Олег (26.02.2010 / 20:06)
dek, ну ты жене на своих ногах бегать по базе будешь). Я тебе щас все разрисую и ты изменишь мвое мнение) MySQL позволяет работать с большими массивами данных намного быстрее чем php, по сути это одна из задач MySQL. На первый взгляд когда список друзей небольшой, то быть может php выигрывает, хотя тут не ощутимо, но когда список друзей растет, строка, преобразованная в массив средствами php накладывает на php большие накладные расходы, что загружает ибез того не вечную память процессора. Можно, конечно и не прибегать к php, а сразу подставлять в sql-запрос в секцию WHERE IN(str). Но MySQL реляционная БД, а не объктная. Неудобно будет работать, когда нужно выбрать конкретные Id друзей.

16. Анатолий (26.02.2010 / 20:33)
15, лекция о БД и РНР я и так достаточно наслушался))) хотя всеравно спасибо, не многие рассказывают что почем, а не посылают в гугл или в пешое эротическое путешествет)
А насчет выбора, писал лично для себя и не соц. сеть, там хватало и такого выбора, вот и подкинул один из вариантов.
Хотя всеравно остаюсь при мнении, что лучше ИД и строчка, т.к допустим у нас есть 20К пользователей и у каждого пользователя есть хотя бы 500 друзей.
Итого в таблице получается 10М записей. Как ты думаешь, быстрей выполнится страница, которая выберет одну по ключу и обработает строку длинной около 3К символов средствами РНР или та, которая выберет селектом по сравнению (пускай даже int значений) из 10 000 000?

17. ramzes (26.02.2010 / 21:24)
По ключам выбирай, вообще таблицу читать не будет, кроме строк ключи которых совпадают с запросом.
Они же для этого и существуют.
WHERE user = 'kolyan' AND friend = 'Vasya' все таки на много проще, в том числе и потому что данных меньше,
информация всего об одном юзере,
а если 20к пользоваетелей то вероятно у кого то может быть 1к друзей и все в одной строке->массиве->ячейка с нужным идsmile разница на лицо.

18. Олег (26.02.2010 / 22:10)
dek, ты меня удивляешь еще больше)
Приведи свой запрос, который выбирает из БД друзей конкретного пользователя

19. Анатолий (28.02.2010 / 18:08)
$query=mysql->("SELECT str FROM friends WHERE id = 'ИД_пользователя' LIMIT 1;");
$friends_str=mysql_result($query,0,0);
$friend=explode(":",$friends_str);
Вот и массив Ид

20. Олег (28.02.2010 / 21:32)
Жесть)))) И ты потом в цикле делаешь sql-запрос к БД на выявление списка друзей?

21. Анатолий (01.03.2010 / 02:17)
всех вместе я их нигде не вывожуsmile на странице 6 штук выходит)

22. Олег (01.03.2010 / 11:24)
dek, всеравно ты массив ид запросом через цикл прогоняешь? Уже 6 однотипных запросов к БД за один http-запрос

23. Анатолий (03.03.2010 / 12:31)
Возможно)
пересмотрю алгоритм. спс ;)

URL: https://visavi.net/topics/6093