Struttura di un db per piccolo CMS

Sto realizzando un piccolo CMS e sono alle prese sul come strutturare il db .....

In particolare sono indeciso sul come creare la/le tabelle che dovranno ospitare i contenuti ("o pagine").

Secondo voi è opportuno creare più tabelle o una sola ???? ... magari realizzata in modo che mi permetta di agganciare i contenuti in modo gerarchico ...

Mi interesserebbe avere un risultato di questo tipo:

 Pag 1

  |___> Pag 2

  |            |____> Pag 5

 Pag 3

  |___> Pag 4

..... e così via!

Come faccio a realizzare una struttura di questo tipo e a consentire magari .... ove necessario, di spostare una pagina da un livello ad un'altro all'interno della struttura???

A dire la verità ho già realizzato 3 tabella che contengono gli stessi campi e che sono collegate a cascata da una fkey ... ma non la trovo pratica come soluzione ...

Qualcuno ha un suggerimento da darmi??

inviato 10 anni fa
ninext
X 0 X

Dipende dalla flessibilità che vuoi garatire al sistema.

Se ad esempio sei sicuro che il livello di "profondità" delle diramazioni non supererà il secondo allora potresti realizzare un sistema a sezione->categoria->pagina. In pratica ogni pagina appartiene ad una categoria che a sua volta appartiene (insieme ad altre categorie) ad una sezione. Servirebbero quindi 3 tabelle: una per le sezioni, una per le categorie ed una per le pagine vere e proprie.

Se invece non vuoi vincolare a priori il numero di livelli in cui suddividere i contenuti allora devi organizzare un sistema ad albero di categorie e sottocategorie. Per farlo devi scegliere una delle tecniche per la gestione degli alberi in un DB. Se fai una ricerca nel forum dovresti trovare dei link a degli articoli che speigano come fare.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie per la disponibilità ....

Diciamo che per adesso mi potrei accontentare anche di una struttura con 4 tabelle ...... così costruite:

CREATE TABLE `sezioni` (

  `id_sez` int(11) NOT NULL auto_increment,

  `nome_sez` varchar(50) collate latin1_general_ci default NULL,

  `testo_sez` longtext collate latin1_general_ci,

  `ordvis_sez` int(11) default NULL,

  PRIMARY KEY  (`id_sez`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE `content_lev1` (

  `id_cl1` int(11) NOT NULL auto_increment,

  `idsez_cl1` int(11) default NULL,

  `titolo_cl1` varchar(100) collate latin1_general_ci default NULL,

  `sottot_cl1` text collate latin1_general_ci,

  `testo_cl1` longtext collate latin1_general_ci,

  `keyword_cl1` text collate latin1_general_ci,

  `ordvis_cl1` int(11) default NULL,

  `linkflag_cl1` enum('Y','N') collate latin1_general_ci default 'N',

  `linkurl_cl1` varchar(250) collate latin1_general_ci default NULL,

  `linktitle_cl1` varchar(250) collate latin1_general_ci default NULL,

  `linktarget_cl1` varchar(10) collate latin1_general_ci default NULL,

  `pubblicaflag_cl1` enum('Y','N') collate latin1_general_ci default 'Y',

  `dtcreaz_cl1` datetime default '0000-00-00 00:00:00',

  `dtmodif_cl1` datetime default '0000-00-00 00:00:00',

  PRIMARY KEY  (`id_cl1`),

  KEY `idsez_cl1` (`idsez_cl1`),

  KEY `keyword_cl1` (`linkflag_cl1`,`pubblicaflag_cl1`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

CREATE TABLE `content_lev2` (

  `id_cl2` int(11) NOT NULL auto_increment,

  `idcl1_cl2` int(11) default NULL,

  `titolo_cl2` varchar(100) collate latin1_general_ci default NULL,

  `sottot_cl2` text collate latin1_general_ci,

  `testo_cl2` longtext collate latin1_general_ci,

  `keyword_cl2` text collate latin1_general_ci,

  `ordvis_cl2` int(11) default NULL,

  `linkflag_cl2` enum('Y','N') collate latin1_general_ci default 'N',

  `linkurl_cl2` varchar(250) collate latin1_general_ci default NULL,

  `linktitle_cl2` varchar(250) collate latin1_general_ci default NULL,

  `linktarget_cl2` varchar(10) collate latin1_general_ci default NULL,

  `pubblicaflag_cl2` enum('Y','N') collate latin1_general_ci default 'Y',

  `dtcreaz_cl2` datetime default '0000-00-00 00:00:00',

  `dtmodif_cl2` datetime default '0000-00-00 00:00:00',

  PRIMARY KEY  (`id_cl2`),

  KEY `linkflag_cl2` (`linkflag_cl2`,`pubblicaflag_cl2`),

  KEY `idcl1_cl2` (`idcl1_cl2`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

CREATE TABLE `content_lev3` (

  `id_cl3` int(11) NOT NULL auto_increment,

  `idcl2_cl3` int(11) default NULL,

  `titolo_cl3` varchar(100) collate latin1_general_ci default NULL,

  `sottot_cl3` text collate latin1_general_ci,

  `testo_cl3` longtext collate latin1_general_ci,

  `keyword_cl3` text collate latin1_general_ci,

  `ordvis_cl3` int(11) default NULL,

  `linkflag_cl3` enum('Y','N') collate latin1_general_ci default 'N',

  `linkurl_cl3` varchar(250) collate latin1_general_ci default NULL,

  `linktitle_cl3` varchar(250) collate latin1_general_ci default NULL,

  `linktarget_cl3` varchar(10) collate latin1_general_ci default NULL,

  `pubblicaflag_cl3` enum('Y','N') collate latin1_general_ci default 'Y',

  `dtcreaz_cl3` datetime default '0000-00-00 00:00:00',

  `dtmodif_cl3` datetime default '0000-00-00 00:00:00',

  PRIMARY KEY  (`id_cl3`),

  KEY `linkflag_cl3` (`linkflag_cl3`,`pubblicaflag_cl3`),

  KEY `idcl2_cl3` (`idcl2_cl3`),

  CONSTRAINT `content_lev3_ibfk_1` FOREIGN KEY (`idcl2_cl3`) REFERENCES `content_lev2` (`id_cl2`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

..... ma mi vengono dei dubbi ... dovuti alla mia ignoranza in MySQL e php .... e sono i seguenti:

- E' possibile tramite php spostare i contenuti di un record dalla tabella "content_lev3" .... a "content_lev2" ..... quindi in sostanza spostarlo di livello??? ....

Il mio problema è proprio questo ... come modificare la struttura dei contenuti: quindi spostare i dati tra i vari livelli ......

Hai qualche dritta in merito???

Ancora grazie per la disponibilità.

risposto 10 anni fa
ninext
X 0 X

Le tabelle non sono corrette: sezioni e sottosezioni sono solo dei contenitori di "articoli" pertanto non memorizzano dei testi. Questi vanno salvati in una tabella a prarte, di nome "articoli". Ciascun articolo poi conterrà le indicazioni sufficienti a risalire a quale sezione/categoria appartiene.

In quest'ottica è evidente come spostare un articolo da una sezione all'altra richiede solo la morifica del suo record, in modo che venga aggiornato l'id della serzion/categoria di appartenenza.

Es:

SEZIONI:

id = 1, nome = "news"

id = 2, nome = "FAQ"

CATEGORIE:

id = 1, sez_id = 1, nome = "Linux"

id = 2, sez_id = 1, nome = "Windows"

id = 3, sez_id = 2, nome = "Installazione di Linux"

ARTICOLI

id = 1, cat_id = 1, nome = "Uscito nuovo kernel"

id = 2, cat_id = 1, nome = "SuSE 10.2 in arrivo"

id = 3, cat_id = 2, nome = "Windows Vista in vista..."

id = 4, cat_id = 3, nome = "Come installo la Debian?"

Per spostare il contenuto "Come installo la Debian?" dalla sezione/categoria "FAQ/Installazione di Linux" alla

"news/Linux" basta questa query:

UPDATE articoli SET cat_id = 1 WHERE id = 4

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

..... ma se volessi fare spostare (guardando alla struttura del mio db) un record  della tabella "content_lev2" alla tabella "content_lev3"   ..... è possibile???

Devo per caso anche modificare la struttura delle tabelle in modo da uniformare le denominazioni dei campi???

risposto 10 anni fa
ninext
X 0 X

per spostare un record da una tabella ad un'altra devi fare una SELECT per estrarre i dati originali, una DELETE per cancellarli ed una INSERT per metterli nella tabella di destinazione.

Non è necessario che le tabelle in gioco abbiano campi con lo stesso nome poiché lo spostamento (e le query annesse) viene fatto da PHP che può tranquillamente adattare il nome dei campi.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda