Dovendo creare un forum contenente delle categorie, proprio come questo, che struttura è consigliabile adoperare per il database?
Dovendo creare un forum contenente delle categorie, proprio come questo, che struttura è consigliabile adoperare per il database?
scaricati i souces di questi forum e dai un'okkiata ai .sql
Il 90% dei problemi di un pc si trova
tra la tastiera e la sedia.
Ho tentato questa via, ma i sorgenti SQL di questi forum contengono un sacco di campi, spesso dal significato incomprensibile, e comunque sono realizzati per funzioni che io non devo implementare. Tutto quello che a me serve è:
Poter gestire delle "categorie", ovvero delle sezioni contenenti le discussioni. Memorizzare i messaggi e associarli all'autore, alla discussione e alla sezione di appartenenza...
se ho capito bene
categoria -> forum -> discussione -> messaggio ?
no no, le categorie fanno parte del forum. Avevo pensato ad una tebella messaggi, con tre campi aggiuntivi in cui memorizzare l'ID dell'utente, l'id della discussione e quello della categoria...
bhe
hai bisogno di 5 tabelle per la gestione dei post\forum
Categorie:
cid | parent | name | description | visible | creation_date
cid -> INT(10) Primary Key UNSIGNED AUTOINCREMENT - è l'id della categoria
parent -> INT(10) UNSIGNED - indica a quale categoria padre appartiene, se è zero vuol dire che è una categoria principale
il resto si capisce...
visibile -> TINYINT(1) UNSIGNED - serve a indicare se la categoria è visibile o meno (0 non è visibile 1 è visibile)
creation_date -> INT(10) UNSIGNED - indica la data di creazione
Forum:
fid | cid | pos | name | description | visible | creation_date
fid -> INT(10) Primary Key UNSIGNED AUTOINCREMENT - è l'id del forum
cid -> INT(10) UNSIGNED - è l'id della categoria a cui appartiene il forum
pos -> TINYINT(3) UNSIGNED - indica la posizione tra i forum (tiny int 3 è massimo 255, e credo ci bastino ^^)
e poi il resto come su
Threads:
tid | fid | uid | titolo | descrizione | testo | visible | creation_date | modification_date
dove tid è l'id (come su) fid è il forum di appartenenza, uid è l'utente a cui appartiene il 3d, poi creation_date e modification-date sono le date sempre in formato time stamp unix
Post:
pid | tid | uid | titolo | testo | visible | creation_date | modification_date
come su ^^
mmm poi ovviamente la tabella degli utenti
e poi...le tabelle di sopra le devi ottimizzare tu creando i blocchi di chiavi in modo da fare tutto molto ottimizzato
VM su SSD da 5$! https://www.digitalocean.com/?refcode=f6925c7f0ddb
Ti ringrazio moltissimo, ora studio bene la struttura che hai proposto e vedo come adottarla e adattarla, visto che ad esempio a me le categorie non servono, quello che volevo dire era che servono diverse "sezioni", quindi secondo il tuo schema diversi forum...
Mi sorgono alcune altre domandine: per ricavare i dati dell'utente che ha postato ogno messaggio (firma, avatar, numero di messaggi, ecc.) viene fatta una query per ogni visualizzazione di post, utilizzando lo stesso while che scorre l'array della query che ha estratto i messaggi? In altre parole, funziona così:O in un altro modo? Penso che il sistema che ho iluustrato effettua un pò troppe query, gravando sul DB e sui tempi di caricamento...Codice PHP:
$query = mysql_query("SELECT uid, titolo, testo FROM posts WHERE tid='2'");
while ($array = mysql_fetch_array($query)) {
// Visualizzazione di titolo e testo del post
$query2 = mysql_query("SELECT nome,firma,messaggi,eccetera FROM utenti WHERE id='".$array['uid']."'");
// Estrazione dei dati dell'utente
}
dovresti studiare cosa sono le join
altrimenti lanci il triplo delle query
soprattutto usa sessioni su database
http://www.mysql.com/doc/en/JOIN.html
importante:
usa principalmente mysql_unbuffered_query quando non devi eseguire dei cicli while nei quali estrai dati e li esegui altre query, e non lo puoi usare con mysql_num_rows
(ti consiglio SEMPRE di usare il comando COUNT nella query, è MOLTO + veloce)
inoltre struttura bene gli indici delle tabelle senno rischi di collassare tutto appena ci sono un po di utenti connessi
VM su SSD da 5$! https://www.digitalocean.com/?refcode=f6925c7f0ddb
diventerebbe cosi:Originariamente inviato da scitrek
codice:$query = mysql_query("SELECT uid, titolo, testo FROM posts WHERE tid='2'"); while ($array = mysql_fetch_array($query)) { // Visualizzazione di titolo e testo del post $query2 = mysql_query("SELECT nome,firma,messaggi,eccetera FROM utenti WHERE id='".$array['uid']."'"); // Estrazione dei dati dell'utente }
e li avresi tutti dentro $arraycodice:$query = mysql_unbuffered_query(" SELECT p.uid, p.titolo, p.testo, u.nome, u.firma, u.messagi FROM posts AS p LEFT JOIN utenti AS u ON u.id = p.uid WHERE p.tid='2';"); while ($array = mysql_fetch_array($query)) { // Visualizzazione di titolo e testo del post }
ho messo la query cosi xche è + leggibile cmq può andare anche su un solo rigo :P
VM su SSD da 5$! https://www.digitalocean.com/?refcode=f6925c7f0ddb
Mi sto documentando riguardo JOIN, nel frattempo portesti illustrarmi il funzionamento delle "sessioni su database" e spiegarmi il funzionamento di quella query?