Самая распространенная ошибка всех начинающих - это наименование полей.
Заимейте привычку именовать основные поля, по которым будут связи в будущем, с именем таблицы.
если таблица authors, то ключевое поле должно быть authors_id
если таблица book, то поле обзывайте book_id
Это сейчас у вас 3 таблицы и можно понять что куда к чему относится.
А когда завтра вы будете джоинить по 5-6 таблиц, вы просто запутаетесь где и что с чем джоинится.
Вот самый обычный пример с 9 джоинами. Если бы во всех таблицах были бы поля просто id, я бы голову сломал чтобы сджоинить. И это самый обычный запрос. А если сюда еще добавить интерсекты, кростабы, группировки, условия и вложенные запросы, то все колом встанет, чтобы интуитивно понять куда что с чем джоинить.
SELECT
o.order_id,
lpad(o.order_id::text, 8, '0') AS order_number,
o.order_date,
o.order_state,
o.member_id,
o.contacts_data_id,
o.invoice_uuid,
o.invoice_number,
z.organization_short_name AS company,
z.organization_id,
y.organization_business_number AS bin,
f.contact_firstname AS firstname,
f.contact_lastname AS lastname,
d.*,
p.*,
x.supply_id,
i.invoice_id,
'2'||lpad(i.order_id::text, 6, '0') AS invoice
FROM
orders o
JOIN contacts_data s ON
o.contacts_data_id = s.contacts_data_id
JOIN contacts f ON
s.contact_id = f.contact_id
JOIN organizations z ON
s.organization_id = z.organization_id
LEFT JOIN organization_data y ON
z.organization_id = y.organization_id
JOIN order_data d ON
o.order_id = d.order_id
JOIN spare_parts p ON
p.part_id = d.part_id
LEFT JOIN supply_data x ON
x.order_data_id = d.order_data_id
LEFT JOIN supply xx ON
xx.supply_id = x.supply_id
LEFT JOIN invoices i ON
i.order_id = d.order_id
Плюс страны вынести в отдельную таблицу, а в таблице авторов указывать ID страны.
Завтра вы ведь захотите искать по странам. Зачем нагружать базу текстовым поиском и строить индексы по текстовым полям?