Rupert85
25.12.2009 - 03:40
На php&mysql пишу сайт. На сайте разная информация и есть возможность зарегистрироваться. У каждого пользователя может быть один или несколько друзей, или не быть их совсем. Подскажите, как реализовать добавление друзей в учетную запись пользователя? Т.е. есть таблица Users предположим, в таблице идут записи всех пользователей. В голову приходит только создавать отдельную таблицу с друзьями для каждой записи. Только как её реализовать? Всмысле имена полей, взаимодействие с таблицей Users и прочее.
Bezdna
25.12.2009 - 03:44
Добавляешь поле id_friends, куда заносишь id друга.
Rupert85
25.12.2009 - 04:19
Bezdna, ситуация усугубляется тем, что друзей может быть несколько или не быть совсем. Как их записать в одно поле, а потом перебирать этот массив?
таблица users
id | .....
таблица friends
user_id | friend _id
Получить всех друзей юзера %USER%:
SELECT friend_id FROM friends WHERE user_id=%USER%
Получить всех у кого %USER% в друзьях
SELECT id FROM friends WHERE friend_id=%USER%
_____________
qpayct
25.12.2009 - 05:17
Чтобы перебирать массив, его нужно сначала создать. К примеру запись нового друга добавляй со знаком разделителем на конце (к примеру "&"), потом дели строку на массив
$friend=explode("&",$str);
и после перебирай массив
foreach ($friend as $i => $val) {
echo $val."<br/>";
}
qpayct, что-то мне кажется не оптимально это, дря разборок данных у нас мускул есть
_____________
qpayct
25.12.2009 - 08:03
Volch, a мне показалось, как раз не оптимально держать отдельную таблицу всех друзей кто чей... Или это ты так пошутил на ночь глядя?
glock18
25.12.2009 - 09:21
qpayct
что-то мне подсказывает, что он не пошутил. и он прав.
qpayct
25.12.2009 - 09:30
вот как?
тоесть вы утверждаете, что если допустим есть таблица юзеров(к примеру 100 акков), которые все друзья друг друга(тобишь придётся завести таблицу друзей в 100*100 записей) и это будет работаь быстрее, чем если добавить к каждому акку одно поле(стринг) в котором будут перечислены все друзья?
vagrand
25.12.2009 - 10:51
qpayct
1. В описанном тобой случае вариант с отдельной таблицей идеально подходит для поиска френдов по нейму одним запросом. В твоем же случае надо будет выбрать ID всех френдов, а затем по ID инейму искать друзей.
2. Я слабо представляю как в твоем случае можно организовать поиск фендов френдов.
3. Так же возникнет проблема с таким элементарным действием как узнать находиться ли user_1 в списке френдов у user_2
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
qpayct, естественно быстрее
![wink.gif](http://phpforum.su/html/emoticons/wink.gif)
Не говоря об универсальности, расширяемости и прочем.
_____________
qpayct
25.12.2009 - 22:33
да верно.
только вот таблиц получается много...
waldicom
25.12.2009 - 22:36
Цитата (qpayct @ 25.12.2009 - 20:33) |
да верно. только вот таблиц получается много... |
Одна дополнительная таблица - это уже много?
_____________
Свои мозги еще никто не отменял.
Телепатов нету.
qpayct
25.12.2009 - 23:14
одна то одна, зато КАКАЯ!!!
qpayctкакая? из двух целочисленных полей? Или, думаешь, твой вариант с текстовым полем, где хранить id друзей с разделителем займёт меньше места? Не говоря о скорости поиска операций типа "у кого я в друзьях?" -
SELECT * FROM users WHERE friends LIKE '%|@my_id|%'
думаешь быстрее
SELECT * FROM users JOIN friends ON users.id = friends.user_id WHERE friends.friend_id = @my_id
даже без индексов?
_____________