Ваш дизайн выглядит не очень хорошо. Вы описываете отношения "многие ко многим" между книгами и жанрами, книгами и авторами, книгами и вариантами.
Сохранение ссылок на родственный жанр, автора и вариант в таблице книг - неправильный способ go: вы можете хранить только одно связанное значение для каждой книги (один жанр, один автор, один вариант), а вам нужно много. Вместо этого для каждого из этих отношений у вас должна быть отдельная таблица, называемая таблицей мостов, которая ссылается на ассоциации.
С другой стороны, информация, которая зависит от книги (например, название), должна храниться в таблице книг.
Вот один пример для книг и жанров:
create table books(
book_id int primary key,
title varchar(100), --dependent column
pub_date date --dependent column
);
create table genres(
genre_id int primary key,
name varchar(100)
);
create table book_genres(
book_id int references book(book_id),
genre_id int references genre(genre_id),
primary key (book_id, genre_id)
);
Теперь предположим, что вы хотите перечислить все книги, относящиеся к жанру 'Sci-Fi'
; вы бы go:
select b.*
from books b
inner join book_genres bg on bg.book_id = b.book_id
inner join genres g on g.genre_id = bg.genre_id
where g.name = 'Sci-Fi'
Один и тот же лог c должен быть реализован для всех без исключения отношений «многие ко многим» в вашей схеме.