Стек: Revel (Go), PostgreSql
Продемонстрировать владение определенным стеком технологий:
- Go, Revel
- PostgreSql
- HTML, CSS, JavaScript
Представим что у нас есть некий список книг, авторов и издательств.
- У каждой книги есть автор и издательство, в котором она издана.
- У автора может быть несколько книг, и он может работать с разными издательствами.
- Книга может быть издана сразу несколькими издательствами.
- Над некоторыми книгами могли работать несколько авторов.
- Наш список авторов и издательств неполный - то есть в базе данных присутствуют записи с книгами, которые не соответствуют какому либо автору и/или издательству.
- Продумать бизнес-логику базы данных.
- Создать оптимизированную структуру таблиц под данную задачу.
- Сверстать страничку, которая будет отображать списки книг, авторов и издательств. Возможно использование css шаблонов (Bootstram, Tailwind и т.д.).
- Реализовать возможность сортировки данных.
- Сделать возможность вывода списков в соответствии с заданными исходными данными, например:
- вывод списка авторов соответствующих определенному издательству
- вывод списка книг соответствующих определенному автору и/или издательству
- вывода списка книг, которые не соответствуют ни одному автору, и/или ни одному издательству в нашем списке.
Для выполнения данного задания необходимо использовать
- В качестве Базы данных: PostgreSql
- Фреймворк Revel, который написан на языке Go.
- Результат опубликовать на сайте github.com в виде репозитория
- В процессе работы необходимо активно использовать git и создавать коммиты на основных этапах разработки.
- Бизнес-логику базы данных оформить в виде миграций и опубликовать в отдельной папке проекта.
Cписок книг, авторов и издательств.
- У каждой книги есть автор и издательство, в котором она издана.
- У автора может быть несколько книг, и он может работать с разными издательствами.
- Книга может быть издана сразу несколькими издательствами.
- Над некоторыми книгами могли работать несколько авторов.
- Наш список авторов и издательств неполный - то есть в базе данных присутствуют записи с книгами, которые не соответствуют какому либо автору и/или издательству.
Из исходных данных можно выделить 3 сущности-таблицы:
- Книги / book
- Авторы / author
- Издательства / publisher
Название поля | Тип | Свойства |
---|---|---|
Id | Число | Уникальное, Автоинкрементируемое, Первичный ключ |
Название книги | Строка | Не может быть пустым |
Название поля | Тип | Свойства |
---|---|---|
Id | Число | Уникальное, Автоинкрементируемое, Первичный ключ |
Имя автора | Строка | Не может быть пустым |
Название поля | Тип | Свойства |
---|---|---|
Id | Число | Уникальное, Автоинкрементируемое, Первичный ключ |
Название издательства | Строка | Не может быть пустым |
Все таблицы связаны друг с другом отношением "Многие-ко-Многим":
- Книги - Авторы:
- у книги может быть несколько авторов
- автор может иметь несколько книг
- Книги - Издательтва:
- книга может быть издана несколькими издательствами
- издательство может иметь несколько разных книг
- Авторы - Издательства:
- автор может работать с разными издательсвами
- издательство может работать с разными авторами
Следовательно, необходимо создать отдельные таблицы, в которых каждая запись/строка будет состоять из 2 внешних ключей и хранить связь между двумя таблицами.
- book_author
- book_publisher
- author_publisher
По хорошему нужно сделать триггер для добавления записей в author_publisher
- "Вручную" записи имеет смысл добавлять только в таблицы book_author и book_publisher
- author_publisher зависит от них: если у автора нет ни одной книги или книга есть, но она нигде не издана, то с издательствами этот автор не работает
- Соответственно добавление связи автор-издательство должно происходить при добавлении данных в таблицы book_author/book_publisher
- При добавлении в одну из этих таблиц нужно проверить, есть ли связь во второй таблице, и если есть, то создать новую запись в author_publisher
Например
- Добавление записи в таблицу book_author: Автор - 1, Книга - 1
- Проверка: издана ли эта книга кем-либо?
- Если да, то добавляем в author_publisher данные об авторе и издательстве
- Если нет, то ничего не делаем (создадим запись при добавления данных в book_publisher)
По условиям задания необходимо реализовать возможность вывода списков в соответствии с заданными исходными данными, например:
- вывод списка авторов соответствующих определенному издательству
- вывод списка книг соответствующих определенному автору и/или издательству
- вывода списка книг, которые не соответствуют ни одному автору, и/или ни одному издательству в нашем списке.
В качестве решения можно добавить 2 селект-инпута:
- Выбор издательства (с пунктами "Без издательства"/"Любое")
- Выбор автора (с пунктами "Без автора"/"Любой")
Опционально добавить: подсветить строки или убрать ненужные
Докер-контейнер (требуется установленный Docker)
Находясь в корне проекта запустить команду:
docker-compose up
# выход из консоли Ctrl+C
Открыть сайт по адресу: http://localhost:8090/
- Создать БД PostgreSQL (в pgAdmin или в CLI psql)
create database book_store;
- Запустить миграции БД для создания всех таблиц и добавления в них данных
Вручную:
export DB_URL='postgres://postgres:root@localhost:5432/book_store?sslmode=disable'
export MG_PATH='database/migrations'
migrate -database ${DB_URL} -path $(MG_PATH) up
Или make-скриптом (требуется установленная утилита Make):
make mg_up
- Запуск сервера
revel run
Открыть сайт по адресу: http://localhost:9000/