Система Библитека. Как спроектировать БД для хранения многих экземпляров книг и функционала по заказу этих книг?
==================================================================================================================

 Проектирую систему **Библиотека**.   

Задача - *хранение информации о пользователях библиотеки, книгах, и бронировании книг пользователями.*  

Есть 2 типа ролей: **Администратор** и **Зарегистрированный пользователь**.  

  

Администратор может выдавать книги на руки. Путь такой:  

Пользователь выбирает книгу, нажимает забронировать, если книга доступна, то книга переходит в статус забронирована. Далее администратор может перевести книгу в статус "на руках" за таким-то пользователем ну соответственно потом книга возвращается и переходит в статус "в библиотеке". Если в библиотеке таких книг 2 экземпляра, то приходит другой пользователь и делает тоже самое с этой книгой. Такая цепочка.   

  

Также администратор может добавлять книги в базу (указывать их кол-во, название, автора, жанр).  

  

Я спроектировал пока что базу данных выделив 5 основных сущностей:  

1. Users (if, firstName, lastName, email, password, isBanned, idRole)  

2. Roles (id, name)  

3. Books (id, title, description, year, cover, idAuthor, idGenre)  

4. Authors (id, firstName, lastName)  

5. Genres (id, name)  

  

Какие нужно сущности добавить, чтобы реализовать процесс бронирования? Я думал над таблицей Orders в которой будет idUser, idBook, и статус, в который перешла книга. Но если указывать idBook книги, а таких книг 10 экземпляров, то получается пользователь заказал их все)) я тут не понимаю как поступить. Если рассматривать книгу как единственный экземпляр в библиотеке, то кажется несложным создать эту таблицу с заказами. Но я хочу чтобы книг каждой было по 10 экземпляров в библиотеке и информация о их бронировании могла бы сохраняться и ничего не было бы потеряно. Чтобы я мог посмотреть кто бронировал книгу за последний год, у кого она сейчас и тд.  

  

Предположения: 

 В дополнение к сущности "книга":  

Books (id, title, description, year, cover, idAuthor, idGenre)  

Добавить таблицу "экземпляр книги":  

 BookEntities (id, -- идент. экземпляра книги  

 idBook, -- идентиф. книги  

 add\_date, -- дата внесения в каталог  

 exc\_date, -- дата исключения из каталога   

 deterioration, -- изношенность  

 wieght -- вес  

)  

А в таблицах выдачи/приема уже оперировать экземплярами книг.  

PS: Не всегда в библиотекарской системе требуется такая детализация, может оказаться так, что достаточно отслеживать баланс между макс. кол-во книг, и сколько выдано, при помощи триггеров в базе. 

 Для каждого экземпляра книги делать отдельную запись (т.е вводишь еще одну сущность), так как выдают конкретный экземпляр, ну и скорее всего каждый экземпляр имеет уникальный номер. 

 У книги есть инвентарный номер (id) и вы забыли ISBN.   

  

Orders тогда выглядит так  

id, startDate, dueDate   

Books (id, title, description, year, cover, idAuthor, idGenre, status, userid (null) , orderId (null))  

  

Впрочем это вкусовщина и зависит больше от того какого плана запросов будет больше, некоторые поля можно перенести в orders