Consiglio su criterio concettuale per relazionare tabelle

Salve a tutti. vado subito al dunque. Sto cercando di realizzare un sito di tv, teatro e spettacolo in generale, fra le varie sezioni che vorrei avesse questo sito, ce n'é anche una relativa agli attori.

Quando si apre la home page della sezione attori, una serie di thumbnail vengono caricate e visualizzate in una griglia di 6 colonne x 9 righe, la griglia prende tutto il layout.

Appena sotto ogni thumbnail, che poi sarebbe la foto dell'attore, appare il suo nome. Cliccando su una thumbnail, si viene indirizzati in una pagina dettaglio dell'attore, con la sua biografia, e tutta una serie di altre thumbnail che riguardano i suoi film, le sue interviste, le sue partecipazioni ad altre trasmissioni, ecc.

Al click su ognuna di queste thumbnail, si va a pagine esterne al sito.

Inoltre nella pagina dettaglio di ogni attore, saranno anche inseriti i meta tag relativi ad ogni attore.

Ora, il mio problema come da titolo, č capire bene secondo quale concetto io devo dividere e relazionare le tabelle di un database. Per quello che concerne la sezione degli attori, ho creato queste tabelle qui sotto:

actor

--------------------------------------------------------------

|    pid     |        pname        |   pbio   |   pstatus   |

--------------------------------------------------------------

actor_meta

-----------------------------------------------------------------------------------------------

|     pmid    |   pmpid   |    ptitle    |     pkey     |     pdesc    |         pseo         |

-----------------------------------------------------------------------------------------------   

Tabella dei meta actor - relazione: actor_meta.pmpid -> actor.pid

actor_img

------------------------------------------------------------------------

|    piid     |   pipid   |     pbig     |    psmall    |    pthumb    |

------------------------------------------------------------------------

Tabella delle img attori - relazione: actor_img.pipid -> actor.pid

actor_video

---------------------------------------------

|    pvid     |  pvpid  | pvstatus | pvideo |

---------------------------------------------      

Tabella dei video attori - relazione: actor_video.pvpid -> actor.pid

actor_banner

----------------------------------------------

|    pbid     |  pbpid  | pbstatus | pbanner |

----------------------------------------------      

Tabella dei banner attori - relazione: actor_banner.pbpid -> actor.pid

Esse sono distribuite e relazionate secondo i concetti che rappresentano, almeno secondo la mia modesta preparazione, per quello che ho letto in giro.

Prima tabella - Dati principali di un attore, nome, biografia e se č visibile o meno

Seconda tabella - I meta tag di ogni attore

Terza tabella - le immagini che riguardano l'attore, quindi la thumbnail di apertura, una immagine grande all'interno della pagina dettaglio, ed una miniatura per il back end

Quarta tabella eventuali video dell'attore sempre all'interno della sua scheda

Quinta tabella - eventuali banner inerenti l'attore sempre all'interno della pagina dettaglio

Credo che concettualmente, sia abbastanza accettabile come suddivisione.

Mi sono allora chiesto se non fosse il caso di cambiare la concettualitą della divisione delle tabelle per migliorare le cose, ed invece che per concetti, dividere il database secondo "le chiamate" diciamo cosģ.

Quindi, considerando che nella prima pagina vengono caricati, la thumbnail, il title della thumbnail, il nome dell'attore, potrei strutturare la prima tabella cosģ:

actor

-----------------------------------------------------------------------------------------

|     pid     |        pname        |    pthumb    |   pstatus   |        pseo      |

-----------------------------------------------------------------------------------------      

Nella tabella actor c'é tutto il necessario per tutto ciņ che viene caricato in home page attori

quindi avrei una unica query "SELECT pname, pthumb, pseo WHERE pstatus = 1"

Alla chiamata di una pagina dettaglio attore avrņ bisogno di:

actor_meta

------------------------------------------------------------------------

|     pmid    |   pmpid   |    ptitle    |     pkey     |     pdesc    |

------------------------------------------------------------------------

Tabella dei meta actor - relazione: actor_meta.pmpid -> actor.pid

actor_img

---------------------------------------------------------

|    piid     |   pipid   |     pbig     |    psmall    |

---------------------------------------------------------   

Tabella delle img attori - relazione: actor_img.pipid -> actor.pid

actor_video

---------------------------------------------

|    pvid     |  pvpid  | pvstatus | pvideo |

---------------------------------------------      

Tabella dei video attori - relazione: actor_video.pvpid -> actor.pid

actor_banner

----------------------------------------------

|    pbid     |  pbpid  | pbstatus | pbanner |

----------------------------------------------      

Tabella dei banner attori - relazione: actor_banner.pbpid -> actor.pid

nella pagina dettaglio avrei questa query:

SELECT `pid`, ptitle`, `pkey`, `pdesc`, `pbig`, `pvideo`, `pbanner`

FROM (`actor`)

JOIN `actor_meta` ON `pmpid` = `pid`

JOIN `actor_img` ON `pipid ` = `pid`

JOIN `actor_video` ON `pvpid` = `pid` AND `pvstatus` = 1

JOIN `actor_banner` ON `pbpid` = `pid` AND `pbstatus` = 1

Volevo in definitiva capire quale dei due approcci dovrei seguire per avere un database pił performante. Forse la prima versione č pił scalabile. Grazie per l'attenzione e scusate la lunghezza del post.

Kama

inviato 5 anni fa
kama
kama
1
X 0 X

Secondo me l'unico criterio che puoi adottare č quello della numerositą delle relazioni.

Quindi, se un attributo di un attore č univoco (per esempio il thumbnail), va nella table dell'attore, se č multiplo (per esempio le foto), va in una tabella separata.

Ma se hai n attributi fissi (non so, per esempio i meta potrebbero esserlo, vanno tutti nella tabella con l'attore.

risposto 5 anni fa
Massimiliano Arione
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda