Ваша текущая модель данных будет иметь один существенный недостаток - то есть книги должны быть возвращены в одно и то же время (ну, не совсем, но это будет Loan
return_at ', когда возвращается первая книга, или в последний?).
Существует также некоторая разница между Friend
и Author
- что произойдет, если друг станет автором (или автор станет другом)? Они попадут в вашу базу данных дважды, что является проблемой.
Вот как я могу запустить вашу библиотечную базу данных (что есть, даже если вы одалживаете только друзьям). Я ничего не знаю о datamapper, так что это сами дизайны таблиц.
Person
==========
id -- autoincrement
fullname -- varchar(128) - names are tricky, keep it simple here
nickname -- varchar(15), nullable - optional
Book
=========
id -- autoincrement
isbn -- char(16) - check length, though
title -- varchar(128) - this only works with single-language libraries
yearPublished -- integer
Book_Author
=============
bookId -- fk reference to book.id
authorId -- fk reference to person.id
Subject
==========
id -- autoincrement
subject -- varchar(16)
description -- varchar(256)
Book_Subject
===============
bookId -- fk reference to book.id
subjectId -- fk reference to subject.id
Checkout
===============
id -- autoincrement
occuredAt -- timestamp, UTC if possible (or capture timezone)
bookId -- fk reference to book.id
personId -- fk reference to person.id
Checkin
==============
id -- autoincrement
occuredAt -- timestamp, UTC if possible (or capture timezone)
bookId -- fk reference to book.id
Затем вы можете указать, какие книги у вас есть на данный момент, по каким книгам запись Checkin
позже, чем все записи Checkout
.
<ч />
РЕДАКТИРОВАТЬ:
Для «групповой» проверки / ввода замените Checkout
/ Checkin
следующими версиями:
Checkout
===============
id -- autoincrement
occuredAt -- timestamp, UTC if possible (or capture timezone)
personId -- fk reference to person.id
Checkin
============
id -- autoincrement
occuredAt -- timestamp, UTC if possible (or capture timezone)
Checkout_Book
==================
checkoutId -- fk reference to Checkout.id
bookId -- fk reference to Book.id
Checkin_Book
==================
checkinId -- fk reference to Checkin.id
bookId -- fk reference to Book.id
Обратите внимание, что вы не хотите просто добавлять таблицы _Book
- вам также нужно удалить ссылку fk из таблиц транзакций, иначе вы рискуете получить несколько неприятных дублирующих записей.