Система Библитека. Как спроектировать БД для хранения многих экземпляров книг и функционала по заказу этих книг?
Проектирую систему Библиотека.
Задача - хранение информации о пользователях библиотеки, книгах, и бронировании книг пользователями.
Есть 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: Не всегда в библиотекарской системе требуется такая детализация, может оказаться так, что достаточно отслеживать баланс между макс. кол-во книг, и сколько выдано, при помощи триггеров в базе.
AVKor, то есть моя таблица Books пусть превратится в BookModels (или BookMakets как Вы советуете) и добавить таблицу BookInstances где будет столько записей, сколько экземпляров книг?
Kirill Mager, Нет, я считаю предложенное название в данном ответе неудачным (см. материал по моей ссылке выше), макет книги - это совсем другое. Пусть остаётся сущность Книга, и добавить сущность Экземпляр Книги. Но суть вы уловили верно.