Datenbank Design für Bücher mit verschiedenen Autoren

timestamp

Mitglied Käsekuchen
Hallo Forum,

Ich möchte ein paar Bücher verwalten und die dazu gehörigen Autoren auflisten.
Beispiel:
Buch A, Autor a
Buch B, Autor a, Autor b
Buch C, Autor c, Autor d, Autor e

Jeder Autor hat einen Vor- und Nachnamen, ggf auch noch einen Mittleren Namen.
Autor a: vn_a mn_b nn_c
Autor b: vn_d NULL nn_f

Wie lege ich jetzt am besten meine Datenbank an, damit ich möglichst schnelle Suchergebnisse erziele?
Ich dachte an folgendes Design für die Bücher Tabelle:
Code:
books
-book_id (INT) prim_key
-book_title (varchar)
-book_authors (INT)


authors
-author_id
-author_firstname
-author_middlename
-author_lastname

Wie verknüpfe ich jetzt aber mehrere Autoren?
Mein erster Gedanke war, die book_authors als VARCHAR zu deklarieren, die AutorenIDs kommasepariert einzutragen, und mit FIND_IN_SET zu arbeiten, was leider nicht klappt, wenn es mehrere Autoren mit selben (Teil-) Namen gibt.
Zweiter Gedanke, Bücher mehrmals abzuspeichern mit verändert book_author spalte, allerdings habe ich dann jede Menge redundante Daten
Dritter Gedanke: eine PaarTabelle für Autoren zu erstellen
Code:
pairs:
-pair_id IDX
-author_id IDX
{pid: 1, aid: 1; pid: 1, aid: 2; pid: 1, aid: 3; pid: 2, aid: 2; pid: 2; aid: 5; pid: 3, aid: 9}
Und die pair_id dann in der Buchtabelle zu speichern.
Wenn ich jetzt aber nach einem Autor suchen möchte, muss ich erst die ID aus der author Tabelle suchen, dann in die pair_tabelle Joinen, und das ganze dann in die book Tabelle hochziehen.
Gibt es da einen schnelleren Weg oder eine bessere Methode die Daten zu speichern?
Der Query sieht nach meiner Idee 3 dann ja so aus:
SQL:
SELECT * FROM books 
WHERE book_authors IN (
  SELECT pair_id FROM pairs 
  WHERE aid IN (
    SELECT DISTINCT author_id FROM authors
    WHERE author_firstname = 'suche' OR author_middlename = 'suche' OR author_lastname = 'suche'
    )
  )
AND ....
ORDER BY ...

Ich habe ihn gerade mal getestet, er lief auf jeden Fall schneller durch als der erste Gedanke. Allerdings habe ich gerade auch keine nennenswerte Tabelle mit Testdaten.
Wie sieht das denn im Allgemeinen mit so verschachtelten Selects aus?
 
Das ist doch eine Klassische n:m Beziehung. Also eine Tabelle dazwieschen in der die buch_id und autor_id gespeichert ist.
 

Neue Beiträge

Zurück