![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
olegarh |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 6.2.2010 Репутация: нет Всего: нет |
Есть вот такая структура базы данных для функции "Друзья":
поля: id, user_id, friend_id, accept user_id- берем из сессии, friend_id- берем методом GET( учитывая что кнопка друзья находиться на странице пользователя которого нужно добавить), accept - подтверждение дружбы (1- подтверждена, 0-нет) Когда пользователь заходит на страницу "Мои друзья" берем из бд все записи с user_id равным id пользователя и accept равным 1 и выводим их в цикле по id. как вам такая реализация? в плане оптимальности, скорости и т.д. учитывая что кол-во пользователей более 1 миллиона . жду вашей критики)) |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: нет Всего: 102 |
1. id тут не нужен. индекс должен быть по полю user_id
2. зачем хранить данные accepted=0 можно ведь хранить только тех, чья дружба подтверждена. -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Один френд на юзера? Можно было бы сделать индекс на двойное поле - user_id+frend_id, но это вряд ли выигрышь по сравнению с отдельным индексом.
А те, кто послал инвайт храняться в отдельной таблице? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: нет Всего: 102 |
нет конечно, и как это связано с id?
правильно думаешь с учетом того если выдергивать будешь исключительно по ID... но что-то мне подсказывает что данные будут собираться по полю user_id так что индекс на id погоды не сделает... иссесьна! инвайты чернобелые списки - и т.п. логично вынести в отдельные таблицы. -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Это я спутал с ключем... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
olegarh |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 6.2.2010 Репутация: нет Всего: нет |
Ну допустим инвайты хранить в другой таблице это логично) а почему id лишнее? как тогда?
Например
как их тогда потом выводить без ID и еще столкнулся с проблемой!
ну и потом вывожу друзей
так все работает если мы зоходим от пользователя id которого лежит в поле user_id стоит зайти со страницы пользователя чей id в поле friend_id то выводит "друзей нет" Придумал такой выход: создавать по 2 записи в БД, т.е.
но по моему это не рационально! как сделать по другому? |
||||||||
|
|||||||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: нет Всего: 102 |
что подразумевает этот вопрос? выводить их например через var_dump, или echo )))
а про оператор OR что ни будь читали? )) -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
0. лучше все же по две записи на каждое отношение. по двум причинам: во-первых, чем проще запросы, тем проще с кешем(возможно, надуманно). во-вторых, в будущем можно будет легко привязать атрибуты к конкретной связке. пример: ВКонтакте список друзей сортируется по последней активности(количество посещений страницы, отправленных сообщений) - и если я пишу тебе часто и захожу на твою страницу, а ты - игнорируешь меня, то ты у меня будешь вверху списка, а я в твоем списке окажусь где-то внизу.
1. и добавить первичный ключ на связку id_user + id_friend. суррогатный ключ id ничего не дает. так как чаще всего поиск будет происходить по первому полю пары, то производительность не пострадает. Добавлено @ 08:18 в таком случае неподтвержденные заявки лучше хранить в отдельной таблице. зачем они здесь? все равно ты не собирался выводить "неподтвердивших дружбу". Добавлено @ 08:23 мечты, мечты... запросы надо писать не через жопу(до последнего избегать like и прочих операций на строках в условиях WHERE и ON, стараться обходиться без left join - а если и использовать, то только на малых наборах данных). сильно тормозящие запросы(slow log) - отлавливать, выяснять причину тормозов, переделывать структуру и добавлять отсутствующие, но необходимые ключи. разделять функциональность на логические элементы(функции, объекты - на уровне кода, независимо формируемые блоки - на уровне верстки) - сильно упростит внедрение кеширования. всё. нет никаких "волшебных практик проектирования БД для проекта с предполагаемо большой нагрузкой". |
|||
|
||||
olegarh |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 6.2.2010 Репутация: нет Всего: нет |
не совсем понял вот это!
![]() Всем спасибо )) очень помогли ![]() |
||||||
|
|||||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
id с автоинкрементным значением обеспечивает уникальное обозначение для каждой записи-строки. т.е. выступает в качестве первичного ключа.
так как поле не несет в себе никакого смысла, кроме этой самой уникальности - это ключ суррогатный. в то же время пара полей id_user + id_friend тоже обеспечивает уникальность для каждой записи(так как записывать одного и того же человека ещё раз в друзья - бессмысленно). но, в отличие от id, id_user и id_friend имеют значение не только в пределах этой таблицы, так как по сути это ссылки на некую таблицу(условно назову её users). потому можно назвать эту пару полей естественным первичным ключом. а поле id выкинуть нафиг, если ты на него из другой таблицы не ссылаешься. |
|||
|
||||
olegarh |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 6.2.2010 Репутация: нет Всего: нет |
Все понятно!)) Спасибо за разъяснения)))
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |