Come creare un CMS: strutturare il database #2

Eccoci giunti alla terza parte della guida dedicata a come creare il proprio cms personalizzato in PHP/MYSQL, in questa parte vedremo come strutturare il database per partire con il piede giusto il nostro progetto.

In una domanda di Facebook nel gruppo di Targetweb ho chiesto quale sarebbe stato l’argomento più indicato per affrontare questo tema. A richiesta quindi, è uscito il tema “news” ovvero tratterò come integrare un sistema di news automatico e completamente gestibile.

Ovviamente per capire meglio la guida vi invito a leggere le prime due parti della guida:

Parte #1 : Creare un sistema di login sicuro >>

Parte #2 : Brainstorming e struttura della dashboard >>

Fatte queste doverose premesse possiamo iniziare questa terza parte della guida.

01. Carta e penna

Come primo step vi consiglio di creare dei diagrammi di flusso o comunque schemi strutturati per creare una panoramica generale della struttura del database. La cosa più complessa in questo punto sarà normalizzare i dati, ovvero cercare di evitare ridondanze inutili o spreco di query altrettanto dannose.

Normalizzare i dati è una tecnica abbastanza complessa, e almeno all’inizio quasi tutti ci “sbattono la faccia”. Io stesso quando ho iniziato ho fatto clamorosi sbagli ma sono contento di averli fatti in quanto mi hanno aiutato a crescere molto..e in poco tempo. Pertanto il mio consiglio è di provare e riprovare, non si smette mai di imparare 😉

02. Teoria per la normalizzazione dei dati

Cercherò di essere il più chiaro possibile.

ANALISI 1:

Ho un database news che deve contenere:

  • id univoco della news
  • titolo della news
  • Descrizione della news
  • Eventuali immagini

Pertanto potremmo pensare a una tabella di questo tipo:

ID | TITOLO | DESCRIZIONE | IMMAGINI

Ogni record inserito avrà un id univoco, con relativo titolo, descrizione e immagini.Questa tabella in linea di massima potrebbe risultare azzecata, ma se le immagini da salvare fossero più di una?

In questo caso si verificherebbe un errore di normalizzazione in quanto dentro la “cella” immagini per ogni record avremo uno o più elementi. Ricordate che una cella con più elementi non è mai una buona cosa, se riscontrate questa necessità probabilmente non avete strutturato bene il vostro progetto /database.

Detto questo la soluzione è molto semplice, almeno dal punto di vista concettuale. Possiamo creare una seconda tabella, chiamata ad esempio “immagini” strutturata in questo modo:

ID_IMG | PERCORSO | TITOLO | FOTO_NEWS

Dove:

  • id_img è l’id univoco dei record sulla tabella immagini
  • titolo è il titolo della foto (da usare nel tag alt per rendere il sito validato)
  • Percorso è il percorso dell’immagine uploadata per poterla usare effettivamente.
  • foto_news è l’id della news  a cui l’immagine si riferisce

Il risultato:

Tabella ‘news’

ID | TITOLO | DESCRIZIONE |

1   | Prima news| Descrizione ciao |

2   | Seconda news| Descrizione2 ciao |

Tabella ‘immagini’

ID_IMG | PERCORSO | TITOLO | FOTO_NEWS

1    | upload/img01.jpg | Foto1 | 1

2   | upload/img02.jpg | Foto2 |  1

3    | upload/img03.jpg | Foto3 | 1

4    | upload/img04.jpg | Foto4 | 2

Come potete vedere da questo esempio, la prima news ha 3 immagini: (foto 1,2,3) collegate grazie al campo ‘foto_news’ mentre la seconda news ha solo una foto la numero4. Il campo foto_news recupera l’id della news a cui l’immagine si riferisce, in questo modo sarà molto facile richiamare le foto relative alle varie news.

In questo caso, dal punto di vista teorico si dice che l’associazione del database è uno a molti, ovvero per ogni news ho molte immagini. I vantaggi di questo tipo di struttura sono palesi, tuttavia sappiate che esistono anche altri tipi di relazioni.

03. Creazione delle tabelle

Per prima cosa creiamo la tabella principale dedicata allo storage delle news:

CREATE TABLE `news` (
`id` INT( 64 ) NOT NULL AUTO_INCREMENT ,
`titolo` VARCHAR( 255 ) NOT NULL ,
`descrizione` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM

Creiamo anche la tabelle immagini per lo store delle immagini:

CREATE TABLE `immagini` (
`id_img` INT( 16 ) NOT NULL AUTO_INCREMENT ,
`percorso` VARCHAR( 255 ) NOT NULL ,
`titolo` VARCHAR( 255 ) NOT NULL ,
`foto_news` VARCHAR( 64 ) NOT NULL ,
PRIMARY KEY ( `id_img` )
) ENGINE = MYISAM

Non preoccupatevi se per ora le tabella vi sembrano “separate” e non comunicanti, lo saranno molto presto 😉

04. Conclusioni

Oggi abbiamo visto come evitare errori di normalizzazione rendendo il nostro database modificabile, e veloce. Abbiamo anche creato le tabelle principali per la gestione del nostro sito di news, con la possibilità di caricare e memorizzare nel database più di un’immagine per articolo.

Nel prossimo articolo vedremo come inserire fisicamente le news nel database. Se non vuoi perderti nemmeno un articolo di Targetweb.it metti mi piace qui sotto:

  1. Attenzione nella tabella “news” non hai inserito il campo DATA che poi userai nell’articolo seguente… 😉

  2. Hai fatto un po di confusione a numerare le puntate?????, a parte questo … continuerai questa qguida ? Mi stava interessando. Grazie ciao.

  3. ciao, ho visto letto i tuoi articoli, e li ho trovati interessanti… ma il seguito di questo articolo non l’hai mai pubblicato?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Up Next:

Recuperare id da un elemento cliccato con jQuery

Recuperare id da un elemento cliccato con jQuery