Allora metto i campi in italiano con una legenda e cerco di spiegare meglio anche con esempi:
P = primary key, chiave primaria
FK = foreign Key, chiave esterna
"mercato" è il mercato dove viene commercializzato il libro, tipo "com"=USA, "it"=Italia, "de"=Germania etc
"tipologia" può essere: (libro digitale, PB = stampato on demand, audiolibro)
libri on demand = libri che vengono stampati solo al momento dell'acquisto online: non c'è magazzino e si possono quindi cambiare più volte i contenuti e quindi cambiano le pagine etc
Anche il prezzo oscilla.
I siti che li vendono, come Amazon, utilizzano recensioni dei clienti, punteggio (comprendono le valutazioni fatte da 1 a 5 stelline senza recensione + le recensioni scritte), posizionamento in loro classifica interna per mercato di riferimento.
E si possono vendere in vari mercati internazionali: per es. lo stesso libro scritto in inglese lo si può vendere in USA, in Canada, in Australia, in Inghilterra
e quindi cambia il "mercato" e anche il n° di recensioni e la classifica interna avrà valori diversi a seconda del mercato anche se è lo stesso libro.
Lo scopo di questo DB è raccogliere le modifiche fatte a certi libri nel tempo per poi poter interrogare il DB e avere una lista dei dati modificati in un certo intervallo di date, oppure la situazione attuale del libro per tutti gli attributi elencati.
Poi eventualmente, con questi dati, comparare l'andamento delle modifiche fra libri concorrenti, fare grafici etc
Tabella base per attributi statici del libro (non cambiano nel tempo)
Libro (libroID (P), ISBN, titolo, autore, sottotitolo, tipologia )
es:
dataAttuale = 24 Oct, libroID = 35, ISBN= 3240276353, prezzo = 13.90,
incasso = 5.01, pagina = 245, recensione = 232, punteggio = 312, classifica = 23467
Per gli attributi dinamici, che possono cambiare nel tempo e anche spesso:
1)
creare diverse tabelle per ogni attributo da monitorare con la data della sua modifica:
Pagina (dataAttuale, libroID FK, pagina)
Recensione (dataAttuale, libroID FK, mercato, recensione)
Punteggio (dataAttuale, libroID FK, mercato, punteggio)
Classifica (dataAttuale, libroID FK, mercato, classifica)
Prezzo (dataAttuale, libroID FK, mercato, prezzo, incasso)
In questo caso inserirei una riga solo se quell'attributo cambia in quella determinata data.
Se invece cambiano tutti gli attributi nella stessa data diventerebbe:
Libro --> 35, 3240276353, "titolo libro1", "autore1", "sottotitolo libro1", "PB"
Pagina --> 24 Ott, 35, 245
Recensione --> 24 Ott, 35, "com", 232
Punteggio --> 24 Ott, 35, "com", 312
Classifica --> 24 Ott, 35, "com", 23467
Prezzo --> 24 Ott, 35, "com", 1390, 501
Ma in questo modo avrei per ogni libro 4x3 più ripetizioni rispetto alla 2) di: [24 Ott, 35, "com"]
2)
DatiDinamici (dataAttuale, libroID FK, mercato, prezzoID FK, pagina, recensione, punteggio, classifica)
Prezzo (prezzoID, prezzo, incasso)
fare una sola tabella "DatiDinamici" dove metto i vari attributi dinamici, a parte magari il Prezzo:
Libro --> 35, 3240276353, "titolo libro1", "autore1", "sottotitolo libro1", "PB"
DatiDinamici --> 24 Ott, 35, "com", 16, 245, 232, 312, 23467
Prezzo --> 16, 1390, 501
Però qui mi toccherebbe creare una riga anche se solo un attributo cambia (e mettere null negli altri?) es:
DatiDinamici --> 24 Ott, 35, "com", null, null, null, null, 23467
Con un esempio più realistico, quindi si potrebbe creare una situazione in cui ho:
1)
Libro --> 35, 3240276353, "titolo libro1", "autore1", "sottotitolo libro1", "PB"
Pagina --> 24 Ott, 35, 245
Recensione --> 24 Ott, 35, "com", 232
Punteggio --> 24 Ott, 35, "com", 312
Punteggio --> 28 Ott, 35, "com", 314
Classifica --> 24 Ott, 35, "com", 23467
Classifica --> 25 Ott, 35, "com", 57877
Classifica --> 28 Ott, 35, "com", 3432
Classifica --> 30 Ott, 35, "com", 8932
Prezzo --> 24 Ott, 35, "com", 1390, 501
Prezzo --> 28 Ott, 35, "com", 1199, 432
oppure:
2)
Libro --> 35, 3240276353, "titolo libro1", "autore1", "sottotitolo libro1", "PB"
DatiDinamici --> 24 Ott, 35, "com", 16, 245, 232, 312, 23467
DatiDinamici --> 25 Ott, 35, "com", null, null, null, null, 57877
DatiDinamici --> 28 Ott, 35, "com", 17, null, null, 314, 3432
DatiDinamici --> 30 Ott, 35, "com", null, null, null, null, 8932
Prezzo --> 16, 1390, 501
Prezzo --> 17, 1199, 432
Se io voglio sapere al 29 Ott, quali attributi dinamici ha il libro con ID=35, che query dovrei fare nella 1) e nella 2) tenendo conto dei null ?
Quale approccio è migliore come query, come occupazione di spazio nel DB, come normalizzazione etc
Cioè appunto... qual è la miglior struttura per un DB come questo: tabella singola riassuntiva o tabelle multiple ridondanti?