2009-02-20 8 views
9

Sto costruendo un piccolo forum per esercitarsi. Vedo che i forum come phpBB memorizzano il testo del thread in una tabella separata.Come strutturate lo schema DB di un forum?

Perché? Perché non memorizzarlo tutto nello stesso tavolo?

Qualcosa di simile: thread_id, thread_date, thread_text, thread_author

Perché è fatto in questo modo? Come lo faresti?

+0

Non sono d'accordo, questo argomento è stato ampiamente discusso qui e in altri siti. http://stackoverflow.com/questions/548793/a-good-tutorial-on-creating-a-php-forum-from-scratch/548810#548810 – barfoon

+0

@barfoon, non si tratta di creare un forum, lui è volendo sapere perché phpBB fa quello che fa. Penso che sia una buona domanda. Ora se avesse chiesto, qual è il modo migliore per costruire un forum, sarei d'accordo con te. – Malfist

+0

"Quale pensi sia il modo migliore?" non suona specifico per phpBB. – barfoon

risposta

1

Non memorizzano il testo nella stessa tabella a causa delle dimensioni che la tabella può raggiungere.

In questo modo, anche con un numero molto elevato di voci, la tabella dell'elenco di thread è piccola, ben indicizzata ed è veloce scansionarla. Il testo è accessibile solo quando necessario, utilizzando una chiave primaria, che è anche veloce.

Per piccoli forum, penso che questo non sia necessario, poiché c'è un piccolo overhead di programmazione.

+1

Le colonne TEXT sono memorizzate fuori dalla fila in entrambi i motori, non ha un impatto sulle dimensioni della tabella. – Quassnoi

+0

Sono d'accordo - Penso che la spiegazione di Mario sia quella giusta –

1

Oltre all'eccellente risposta di Julien, è abbastanza comune spostare i post su altri thread (ad esempio un amministratore o un moderatore). Avere il testo in un "post table" aiuta a supportare questo.

+0

Bella idea, non ci ho mai pensato. – Quassnoi

2

InnoDB non supporta l'indicizzazione FULLTEXT e MyISAM non supporta le transazioni.

Non so phpBB, ma probabilmente è per questo che separano le tabelle.

+0

Eri 1 secondo prima di me>< – Mario

3

Non ho mai guardato all'interno del budello di phpBB, ma è perplesso a causa dell'indicizzazione full-text. Motore Inno-db per la tabella principale per consentire la transazione e cosa no. MyIsam per l'indicizzazione di testo completo.

+1

Beh ... phpBB, almeno nelle versioni precedenti alla 3.0, utilizzava MyISAM per tutte le tabelle. –

3

Per prima cosa, il layout del filesystem della maggior parte dei database relazionali è tale che l'archiviazione di grandi blocchi di testo o dati arbitrari può rallentare il sistema. Poiché i dati vengono solitamente archiviati per riga, durante le ricerche il database ora deve saltare i campi di testo a lunghezza variabile anche quando si cercano campi non correlati.

In secondo luogo, mettere tutto in una tabella rende molto più difficile l'aggiunta al modello di dati in seguito, se ad esempio sono necessari più dati per ogni thread_id.

La progettazione di schemi di database richiede una certa istruzione. Dovresti iniziare con http://en.wikipedia.org/wiki/Database_normalization. Assicurati di capire la forma del terzo normale.

4

In realtà non so perché questo è stato fatto, ma una ragione che posso immaginare è l'ottimizzazione della ricerca e del recupero dei metadati dei post (data, autore, ecc.).

According to Joel (e Joel ha sempre ragione! ;-) i database memorizzano i loro dati in campi a lunghezza fissa che contengono record a lunghezza fissa, quindi è facile passare da una riga all'altra semplicemente incrementando un puntatore per la lunghezza del byte di un record. Ma i grandi campi di testo usati per memorizzare il testo non possono avere una dimensione fissa, perché la lunghezza di un post varia su un ampio intervallo e la creazione di una memoria di lunghezza fissa abbastanza grande da contenere tutti i messaggi spreca enormi quantità di spazio. Ciò significa che memorizzare il testo del post nella stessa tabella delle altre informazioni lo renderebbe molto più lento quando si desidera recuperare i metadati per un numero elevato di post, come ogni volta che qualcuno visualizza la pagina principale del forum.

Il modo per ottenere il meglio da entrambi i mondi consiste nel mettere i campi a lunghezza fissa (ad esempio tutto tranne il testo del post) in una tabella e i campi a lunghezza variabile (ad esempio il testo del post) in un altro.

+0

Questo potrebbe essere vero per alcuni (diciamo "legacy" o "primitivo") DBMS ma difficilmente per la maggior parte di quelli moderni - http://www.postgresql.org/docs/current/static/storage-toast.html. –

Problemi correlati