2011-12-27 8 views
5

Questa domanda riguarda esclusivamente le prestazioni e sarei grato se le risposte siano specifiche per il caso che fornisco.Quale è più efficiente: una tabella singola lunga o una tabella distribuita? e perché?

Qual è il livello di prestazione più appropriato?

  • creazione di una tabella con troppi campi
  • creando più di una tabella e distribuzione di campi simili a loro

CASE: un vasto Web CMS Modulo

Modello 1: Lungo ma un tavolo

cms 
----------------------------------------------- 
Id 
Title 
Description 
Images 
Order 
Status 
Publish 
meta_keywords 
meta_description 
meta_author 

Cleary, la maggior parte dei CMS Open Source come joomla usano il modello sopra. Ma penso che quel modello sia lo che uccide lo spirito di RDBMS. Possiamo facilmente separare il contenuto, la configurazione e il meta di un particolare articolo in tabelle diverse. Come il seguente

Motivo 2: Molti, ma correlati Tabella

Cms_content   cms_meta  cms_configuration 
--------------------------------------------------------------------------- 
Id     id    id   
Title    content_id  content_id 
Description   keywords  status 
Content    description  order 
Images    author   publish 

Nota: Le relazioni in questo caso è uno-a-uno

Quale è il modello corretto da seguire? Perché scegliere un tavolo lungo ma uno, o perché non scegliere tabelle distribuite, sul tavolo singolo?

+1

"Corretto" dipende sempre dalle finalità e dai casi di utilizzo. Non c'è un proiettile d'argento – zerkms

+0

@zerkms, d'accordo è per questo che ho fornito anche un caso :) – Starx

+0

Oh, intendevi che è un "caso". Ok. Qualche ragione per dividere l'entità ** single ** nelle parti? I campi appartengono alla stessa entità, questo schema fa il suo lavoro. Quindi non toccare la cosa che funziona ;-) – zerkms

risposta

5

Le uniche possibili cause plausibili per avere dati denormalizzati (una tabella con molte colonne) posso pensare, sono:

  • pigrizia iscritto SQL JOIN s
  • possibili miglioramenti delle prestazioni su enunciati read

mi piace andare per la versione normalizzata per tutto il tempo, perché:

    .210
  • posso essere sicuro di integrità dei dati
  • posso estrarre facilmente informazioni da DB (ad esempio, quanti messaggi hanno qualche meta, quanti METAS distinti ci sono, ecc)
+2

Perché hai detto che 'dati denormalizzati (una tabella con molte colonne)'? Tutti i campi appartengono alla ** stessa entità **. Quindi il tavolo unico ** è normalizzato ** anche – zerkms

+0

Esattamente, perché anche a leggere i metas, quando si sta elencando l'articolo uno per uno. – Starx

+0

@Starx: non leggere i metad specificando i campi esatti necessari in 'SELECT' – zerkms

2

Penso che la chiave di prestazioni su "moderno" - Non conosco molto il significato di "moderno", ma - L'applicazione basata su RDBMS non dipende solo dallo schema del database .

  • impostazioni database: strategia memoria utilizzo, dimensione buffer delle chiavi, interrogare dimensione della cache ecc
  • distribuzionea dati/trasformazione: suddivisione, elaborazione griglia.
  • Strategia cache: utilizzando il motore cache incorporato o altro (come memcached).prestazioni
  • Hardware

Quindi, la stima delle prestazioni non è un problema semplice. Anche una tabella con 100 campi può essere installata in memoria, ma anche la tabella a due campi potrebbe non essere possibile. Una query per le righe 5M può essere eseguita in un minuto, ma a volte la stessa query non termina per 10 minuti su 10 milioni di righe (solo due volte!) - dipende dall'ambiente che ho menzionato sopra.

Quindi, penso che non possiamo scegliere la procedura migliore per casi interi. Per il tuo esempio, la chiave è appesa al gusto di DBA. (non scherzo)

+0

Non ho capito la parte, 'la chiave è dondolata sul gusto di DBA'. Dal momento che non è uno scherzo, per favore spiega – Starx

+1

Queste tabelle non saranno ottimizzate semplicemente "dividendo", in generale. Perché ci saranno solo relazioni 1: 1 tra le tabelle. Per quanto riguarda la divisione, sono d'accordo con @TudorConstantin, ma penso che rompere uno possa mettere in campo 3 tavoli o 5 tavoli o 10 tavoli non è un grosso problema per le prestazioni. E inoltre, questo non è un enorme database per l'aggregazione, la mappa/riduzione, l'analisi o l'applicazione a griglia, giusto? Quindi, ho scritto "È il gusto del DBA". – lqez

Problemi correlati