DB Design: come collegare una singola colonna a una raccolta di entità

0

Ho una domanda di progettazione in formato db che, ne sono sicuro, è stata ampiamente trattata, ma non riesco a trovare già una buona risposta.

Il problema è come collegare in modo efficiente un singolo corso scolastico a una raccolta di libri di testo, un corso può avere 0 libri e può avere 10. Il problema qui è che più corsi possono usare lo stesso libro di testo pure.

Il mio primo pensiero è stato quello di includere le tabelle del libro di testo PK come FK nella tabella dei corsi. Quindi la tabella dei corsi ha un ID composito PK ovviamente id e un libro di testo. Il problema con questo approccio è che la tabella dei corsi potrebbe potenzialmente avere un sacco di colonne, e quindi sto ripetendo l'intera riga del corso per ogni aggiunta di un libro di testo, oltre a dover impostare un libro di testo falso per corsi che non hanno un libro di testo.

Corsi di

  • course_id
  • COURSE_NAME
  • FK textbook_id
  • PK (course_id, textbook_id)

testo

  • textbook_id
  • textbook_name

Il mio prossimo pensiero era di avere una tabella con 10 colonne per i libri di testo, che io uso per collegare un corso a tutti i libri di testo. Ma, non sono sicuro che ci sia un approccio migliore (questo finirà per usare meno spazio), quando penso a questo penso perché non hanno le colonne da manuale1, da manuale2 nella tabella dei corsi, in primo luogo.

Corsi di

  • PK course_id
  • COURSE_NAME
  • FK textbooks_ids

course_textbook

  • FK course_id
  • FK textbook_1
  • FK textbook_2
  • FK textbook_3
  • FK textbook_4

testo

  • ISBN
  • textbook_name

Un po 'di background, usando MySql, Hibernate ORM e scrivendo un indicizzatore di ricerca separato.

Qualcuno ha suggerimenti su un approccio o pensieri migliori su quale di questi due approcci è migliore?

Grazie in anticipo per l'aiuto

    
posta user1944367 29.03.2014 - 03:21
fonte

1 risposta

4

Ti stai certamente avvicinando al tuo ultimo pensiero. Quando inizi a pensare "una classe potrebbe avere al massimo dieci libri di testo", stai complicando il problema più del necessario. Invece di avere più colonne per la tabella course_textbook , rimani con una per il libro di testo e una per il corso. Questa è una mappatura molti-a-molti, ed è esattamente quello che vuoi: la possibilità di scegliere qualsiasi corso, e trovare ogni libro che usa, o scegliere e prenotare, e trovare ogni corso che usa. Tipicamente, nella progettazione del database, ci interessano solo tre condizioni: 0, 1 e molte. La tua dichiarazione SELECT si unirebbe quindi alla tabella, restituendo più righe se ci sono più libri.

    
risposta data 29.03.2014 - 03:26
fonte

Leggi altre domande sui tag