Например:
Есть таблица заказов
id | order_name | type_order | client_id
1 | test_name | default | 1
2 | test_name | default | 2
3 | test_name | default | 3
4 | test_name | default | 4
Есть вторая таблица с предложениями
id | order_id | offer_name
1 | 1 | test_offer_name
2 | 1 | test_offer_name
3 | 2 | test_offer_name
4 | 3 | test_offer_name
Допустим, нам нужно узнать от какого клиента поступило предложение под номером {check_offer_id}
(Для наглядности предположим, что результат выборки можно поместить в переменную)
var order_id = SELECT order_id FROM offers WHERE id = {check_offer_id};
SELECT client_id FROM orders WHERE id = {order_id};
SELECT * FROM users WHERE id = {client_id};
Мы люди умные и не будем делать три запроса в базу. Индексы стоят - делаем LEFT JOIN
SELECT `u`.* FROM offers as `of`
LEFT JOIN orders as `or` ON (`of`.order_id = `or`.id)
LEFT JOIN users as `u` ON(`or`.client_id = `u`.id)
Получим Всю информацию о клиенте одним запросом!
Теперь в чем суть вопроса. Хорошо/Плохо ли поместить в таблицу с предложениями client_id и type дублируя тем самым ключи чтобы не делать лишних запросов в базу
id | order_id | offer_name | client_id | type
1 | 1 | test_offer_name | 1 | default
2 | 1 | test_offer_name | 1 | default
3 | 2 | test_offer_name | 2 | default
4 | 3 | test_offer_name | 3 | default
Это приме абстрактный. В проекте таких таблиц очень много, операции очень часто выполняются и чтобы добраться к каким то данным из таблицы по ключу нужно делать по 3-5 джоинов.
(Например представьте что в таблице users есть поле city_id, а в таблице с городами есть поле admin_area_id, а в таблице с областями есть поле country_id. И представьте какой запрос нужно сделать чтобы получить айди страны для того чтобы собирать статистику вообще в отдельную таблицу по странам.