Tabelas representam relacionamentos/associações de negócios. Os "relacionamentos" que você menciona são FKs (chaves estrangeiras) e que não são necessários para consulta. Eles afirmam que os valores de sublinha para algumas colunas também devem ser valores de sublinha para algumas colunas-chave. O que é necessário é saber o que uma linha diz sobre a situação atual do negócio quando está em uma tabela. (Que, dadas as situações que surgem, determinam os FKs e outras restrições.)
De Obrigatório juntar 2 mesas com seus FKs em uma 3ª mesa :
Assim dado
-- rows where product [id_product] is supplied by [id_supplier] ...
ps_product(id_product, id_supplier, ...)
-- rows where carrier [id_carrier] has reference [id_reference] ...
ps_carrier(id_carrier, id_reference, ....)
nós escrevemos
ps_product s
JOIN ...
ON s.id_product = ...
...
JOIN ps_carrier c
ON ... = id_carrier
WHERE ...
para obter linhas onde
product [p.id_product] is supplied by [p.id_supplier] ...
AND ...
AND s.id_product = ...
...
AND carrier [c.id_carrier] has reference [c.id_reference] ...
AND ... = id_carrier
AND ...
Você precisa conhecer os predicados de suas tabelas e, em seguida, JOIN as tabelas ON ou WHERE condições para que o predicado resultante seja para as linhas que você deseja de volta.
Existe alguma regra prática para construir uma consulta SQL a partir de uma descrição legível por humanos?