Dla relacji n-n pokazało Ci dobrze (tabela łącząca z odpowiednimi kluczami). Problem pojawi się gdy będziesz miał jeszcze książkę jako praca zbiorowa pod czyjąć redakcją. Jak określisz kto czuwał nad tym?

Ogólnie samo "zadanie z biblioteką" jest dość typowym projektem i warto się zastanowić nad relacjami pomiędzy obiektami i tym, jak one będą żyć w systemie. Przykład z rodzaju "oczywisty, niewidoczny na pierwszy rzut oka dla początkującego". Masz adres w postaci jaką widać w linku. Zauważyłeś już, że adres zamieszkania i korespondencyjny są w sumie tym samym (ta sama tabela). Co jednak, gdy ktoś podaje dane z więcej niż jednym telefonem? Idźmy dalej... By ułatwić wpisującemu uzupełnianie danych, miasto jest pozycją z autouzupełnianiem. Będziesz jechał po całej bazie by dopasowywać znalezione u wszystkich userów nazwy miast?
Dlatego przy tym zadaniu zastanów się nie tyle "jak wyglądają tabele?", ale "jakie są relacje między rolami lub obiektami w systemie?", "jakie funkcjonalności mają poszczególne osoby i obiekty?", "Jak widziane przeze mnie obiekty między sobą są widoczne i jak się kontaktują, co zawierają?", bo to pomoże Ci określić właśnie strukturę tabel i ich pola. Ogólnie dobrze zacząłeś, ale diabeł zawsze tkwi w szczegółach

Postanowisz więc, że Cię nieco naprowadzę kilkoma pytaniami odnośnie poszczególnych obiektów:
Adres:
- czy miejscowość ma być dostępna z autozupełniania i wiązać się z określonym województwem lub państwem? (może z automatu te pola uzupełniać?)
User:
- czy może mieć więcej adresów lub określoneg rodzaju danych (telefon, email)?
- jak mają być jego uprawnienia określone? Czym te uprawnienia są i jak działają?
Author:
- czy tylko imię i nazwisko? A może datę urodzenia, rys biograficzny, odnośnik do jakiejś strony z tymi informacjami?
Book:
- jak określić egzemplarze danej książki? Czy każdy egzemplarz ma swoje id czy ujmujemy to inaczej?
- co nam daje kategoria książki i czym jest?
- co jeśli użytkownik nie zna tytułu lub autora? Jak mu pomóc odnaleźć właściwą?
Zauważ, że to tylko początek na podstawie Twojej struktury. Ale kompletnie pomija funkcjonalności i skupia głównie na strukturze. Przykładowo jak planujesz zarządzać nie oddanymi/zniszczonymi książkami? Co z informowaniem bibliotekarza o tym, że ktoś książki nie oddał, a termin mu minął? Jak spersonalizować i ułatwić użytkownikowi dostęp do zasobów? Czy podpowiedzieć kiedy ma być oddana interesująca go książka? A może zasugerować inną, powiązaną autorem, kategorią, tematyką lub wręcz analizując dotychczasowe wypożyczenia użytkownika podpowiedzieć inną, ale aktualnie dostępną? Co z systemem potencjalnego "zaklepania" książki na dany termin? A może analizować częstotliwość pytania o daną książkę by zasugerować bibliotekarzowi/użytkownikom posiadającym obecnie ją, że mogli by się pospieszyć, bo inni też ją chcą.
Jak widzisz, problematyka biblioteki wydaje się początkowo jedynie banalna, ale gdy zaczynasz myśleć o funkcjonalnościach, może się okazać, że początkowy schemat się po drodze rozszerza. Wspomniana książka bowiem może zostać uzupełniona o słowa kluczowe (tagi), które ją scharakteryzują i potrafią pomóc trafić na właściwą userowi nie znającemu autora czy tytułu. Może znać głównego lub pobocznych bohaterów przykładowo (usłyszał gdzieś przypadkiem) albo miejsce w jakim się akcja dzieje. Każda z decyzji potrafi zmienić schemat bazy lub podejście.
By nie rzucać dużej ilści pytań i zero odpowiedzi...
Książka może mieć w bibliotece wiele egzemplarzy. Tak naprawdę większość jest widoczna i rozpoznawana głównie po autorze i tytule, a to wystarczy użytownikowi wypożyczającemu. Ale nie bibliotekarzowi. On jak zauważyłeś rozpoznaje je po także innych elementach. Może istnieć wiele tych samych wersji książki, która z poziomu wypożyczającego jest nieistotna, gdyż zawiera tę samą treść. Przykładem są lektury szkolne. Zauważ jednak że bibliotekarz może mieć już wersje różnych wydawnictw, a na dodatek kilka egzemplarzy każdej. Zaczyna się robić niezły zgryz. Czemu? Ponieważ albo mamy jeden obiekt ogromny, który to wszystko trzyma (i tym samym pewna część danych jest zwyczajnie identyczna) albo wydzielamy mniejsze obiekty (kategoria, wydawnictwo, egzemplarze) i zaczynamy mieć coraz więcej połączeń. Ty przykładowo masz jeden wielki obiekt. Ja bym się zastanawiał nad:
Book:
id, title
Tu trzymamy tylko id i tytuł. Reszta dojdzie z połączeń

Tag:
id, name
Tu będą tagi określające książkę.
Book_tags:
book_id, tag_id
Tutaj trzymamy powiązania tagów z książkami. Oczywiście jeden tag może tyczyć kilku książek. Wszak bohater serii książek wiąże się z każdą. Czyż nie?
Book_version:
id, book_id, publishing_house
To różne wersje (nie egzemplarze!) tej samej książki, różnych wydawnictw przykładowo.
Author:
id, name, surname (i inne dane)
Oczywiście dane autorów - dowolnie rozszerzalne
Teraz mamy dylemat autorstwa. Możemy zastosować kilka podejść. Ja osobiście skłaniam się do dodatowego określenia z czym mamy do czynienia na podstawie tabeli łączącej.
Book_authors:
book_id, author_id, author_status
Czemu tak? Mogę określić, wyróżnić określonych autorów dla danej książki. Jeśli jest jeden tylko, nie ma problemu. Jeśli kilku o tym samym poziomie, też luz. Ale nadając różne statusy, mogę określić czym są (autor główny, współautor, redaktor pracy zbiorowej, autor w pracy zbiorowej itd)
Publishing_house:
id, name (i inne dane)
Oczywiście dane wydawnictwa różne
Book_publisher:
book_version_id, publisher_id
Powiązanie miedzy książką i jej wydawcą.
Category:
id, name
Oczywiście kategorie. Tutaj tylko tak, ale warto zastanowić nad
hierarchicznością kategorii (struktura drzewiasta zapewne).
Book_category:
book_id, category_id
Book_copy:
id, book_version_id, copy_status
Tu to o czym wspominałem - egzemplarze danej książki. Łączą do wersji książki. Ja dodałem status, ale nie czy wypożyczona (choć też można), ale jej stan zużycia (może zostać uznana za zniszczoną, do utylizacji, sprzedaną, zagubioną)
Renting:
user_id, book_copy_id, book_date, book_end
Tu oczywiście serce, czyli wypożyczenie określonego egzemplarza książki.
Jak widzisz rozwinąłem nieco Twoje główne tabele by były bardziej uniwersalne. A uwierz, że to tylko dość pobieżne i można by bardziej się postarać. Na dodatek wziąłem tylko pod uwagę tabele: autor, książka, wypożyczenie. Bez ujęcia usera i jego danych, tabel kar (automatyczne obliczanie za oddanie po terminie), statusu książki (możliwa do wypożyczenia czy z księgozbioru podręcznego?) oraz wielu innych aspektów. Dodam, że warto by archiwizować rekordy z wypożyczeniami już zakończonymi (i z jakim statusem! - oddana, zniszczona, zagubiona) by nie trzymać w aktualnych tych, które już nam nie są potrzebne do bieżących zadań. Myślę, że wystarczająco dałem Ci materiału do przemyślenia