dazle
@dazle
Хороший электрик, но в душе программист

Не могу понять суть реляционных баз данных. Ведь для вывода данных придется делать 2 запроса в разные таблицы?

Прочитал много статей про нормализацию бд, и понял что повторяющеюся информацию в таблицах лучше не хранить для экономии места. Допустим у меня есть таблица users в которой есть 4 столбца id, name, avatar, reyting и таблица сообщений message в которой повторяются эти 3 столбца (name, avatar, reyting) и столбец сообщений mess. Я допустим её упрощаю и привожу 2-ую таблицу message к двум столбцам id и mess, т.к можно найти имя аватарку и рейтинг по id пользователя, но при представлении информации на сайт мне нужно будет брать инфу с 2-х таблиц:
include("bd.php");

$res=mysqli_query($bd, "SELECT * FROM message ");
// и тут же мне нужно как то брать по id из таблицы users: avatar, name, reyting 
while($d=mysqli_fetch_array($res))
{

Cмысл ломится в 2 таблицы при выводе всех сообщений когда можно оставить как есть и сохранять в message не id, а сразу name, avatar, reyting.
У меня еще есть приват сообщения, и добавление пользователями контента в которых такая же ситуация. Много повторяющейся информации относительно имени аватара и рейтинга.
По моему мнению каждый лишний запрос занимает время и я просто не представляю как вытащить инфу с 2-х таблиц массивом. Подскажите как лучше сделать.
  • Вопрос задан
  • 1400 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Смысл нормализации очень простой.
Вот поменял пользователь аватарку.
В нормальной бд ты поменял имя файла в одной строке одной таблицы, и пошел дальше.
В своей текущей бд ты должен лазить по всем таблицам, по всем строкам, где этот юзер упомянут, и ВЕЗДЕ менять имя файла

Достаточно 1 раз занять себя этой увлекательной процедурой, чтобы навсегда забыть про дублирование данных в бд
Ответ написан
Комментировать
Во второй таблице добавляешь еще одно поле user_id, где будешь хранить id пользователя из таблицы users, а дальше изучаешь разные JOIN'ы и строишь одни запрос, который получит все данные сразу с двух таблиц.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Tendor
Таблица user - id_user, name, avatar, rating
Таблица message - id_message, text
Таблица связи user~message - id_user, id_message

Select `user`.`name`, `message`.`text` From `message` INNER JOIN `user` ON (`user`.`id_user` = `message`.`id_user`) Where `message`.`id_user` = 2
Ответ написан
Комментировать
Minifets
@Minifets
Hello world!!!
Фокус вот в чем.
Если вы денормализуете базу, т.е. продублируете поля, то ваши SELECT запросы из одной таблицы будут выполняться быстрее, чем JOIN запрос/2 запроса к базе. Причем не факт, что эта прибавка будет ощутима. Но за эту прибавку вы должны будете заплатить на INSERT и UPDATE запросах, а так же усложнить код самого проекта, добавив лишнии проверки (if, либо eventListener), чтобы ваша база была в актуальном состоянии.

Поэтому денормализация базы данных производится, но только на поздних этапах разработки, и только с целью оптимизировать нагрузки. Если денормализация не улучшает производительность, то и не нужно ее использовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы