[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как оптимизировать связку из трех таблиц
Страницы: 1, 2
SoMeOnE
Добрый день. Чисто теоритический вопрос.
Есть таблица постов, юзеров. Каждый юзер может лайкнуть пост. Что бы знать кто, что лайкнул создана соот третья таблица которая хранит id юзера и поста.
Так вот, если в этой таблице будет сотни тысяч лайков это нормально? Ну или миллионы) Запрос работает так, что выбирает все посты из базы, потом проходит foreach через таблицу связку и проверяет данный юзер уже лайкнул или нет.

Впринципе это очень небольшое локальное мобильное приложение, в котором десятки тысяч сойдут за счастье для клиента) Но из любопытсва хотел спросить и иметь ввиду на будущее. Как нужно делать, если здесь увеличаться или же в дальнейшем, что-то такого рода понадобиться.
tomash
А не легче сделать запрос к таблице с лайками
WHERE user_id = 1 AND post_id = 1
зачем цикл?

_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
sergeiss
Цитата (SoMeOnE @ 13.12.2013 - 18:22)
Запрос работает так, что выбирает все посты из базы, потом проходит foreach через таблицу связку....

За такое руки надо отрывать. До самых ног smile.gif

Потому что всё надо делать внутри БД, а в ПХП передавать только уже готовый результат.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
Цитата
За такое руки надо отрывать. До самых ног

SoMeOnE, не вы первый не вы последний, через это все проходили, кто желал выучить MySQL раньше чем того позволит природа smile.gif (я втом числе, но вовремя остановился)
Просто забудьте о том что вы можете решить поставленную задачу средствами РНР, берите книгу по MySQL и читайте, просто тупо читайте страницу за страницей. Без этого вы будете решать задачу не так как надо, а так как получится...



_____________
Стимулятор ~yoomoney - 41001303250491
SoMeOnE
tomash
sergeiss
В таблице же связке может не существовать комбинации данного поста с данным юзером. Значит он его не лайкнул. Но в этом случае запрос даный пост не вернет.
Или я что-то путаю. Учитывая который час вполне возможно)))

Valick
Вот из-за того, природа не позволяет, решаем проблемы по мере необходимости)
Чтение без боевой практики мне мало профита всегда давало. Но одну хорошую книгу прочитать надо конечно. Согласен)
SoMeOnE
Я выбираю посты не данного юзера. А все посты из базы. Они могут не иметь никакого отношение к нему. Он видит посты всех пользователей.
sergeiss
SoMeOnE, вот ты пишешь "Запрос работает так, что выбирает все посты из базы". А если их миллион - он их тоже выбирает?

Цитата (SoMeOnE @ 14.12.2013 - 01:21)
В таблице же связке может не существовать комбинации данного поста с данным юзером. Значит он его не лайкнул. Но в этом случае запрос даный пост не вернет.

И второй вопрос - про JOIN ты слышал что-нибудь?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vagrand
SoMeOnE
Я бы сделал это в два запроса:
1. Выбор нужных постов, затем сбор их ID в массив;
2. Запрос на выборку лайков для текущего юзера и постов:
select * from likes where user_id = <some_id> and post_id in (....)


На мой личный взгляд вариант с join, а придется использовать left join, хуже чем второй подобный запрос. Этот запрос, а точнее его результат кстати можно довольно хорошо закешировать. Например при помощи Redis.

_____________
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, фрагменты.
Valick
Цитата
На мой личный взгляд вариант с join, а придется использовать left join, хуже чем второй подобный запрос.

чем хуже? если это на уровне интуиции, то спешу вас расстроить она вас подводит

_____________
Стимулятор ~yoomoney - 41001303250491
SoMeOnE
sergeiss
Вы прикалываетесь что ли. Вот запрос.


$query = DB::select('articles.id', 'articles.userid', 'articles.title', 'articles.photo_name', 'articles.auto_number',
'articles.king', array('UNIX_TIMESTAMP("articles.date")', 'date'), 'articles.status', 'app_users.name',
'app_users.first_name', 'app_users.last_name', 'app_users.username', 'app_users.gender', 'app_users.locale')
->
from('articles')
->
join('app_users')
->
on('articles.userid', '=', 'app_users.userid')
->
limit(15)
->
offset($start)
->
order_by('articles.date', 'DESC')
;

$result = $query->execute()->as_array();


if (!empty($post['userid'])) {
foreach ($result as $k => $item) {
$query = DB::select('id')
->
from('users_post_king')
->
where('post_id', '=', $item['id'])
->
and_where('userid', '=', $post['userid'])
;

$kinged = $query->execute()->get('id');
if (!empty($kinged)) {
$result[$k]['kinged'] = true;
} else {
$result[$k]['kinged'] = false;
}
}
}


Как его переписать одним. Если я left join использую. Он мне не возвращает, то чего нет в таблице связке. Ну естесственно пагинация используется в первом запросе. Погорячился сказав, что выбирает все. Но в таблице связке может быть миллионы записей.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.