Domanda

Ho notato che un sacco di gente qui citare le tabelle con 20+ (che ho visto fino al 55) le colonne di una tabella. Ora io non pretendo di essere un esperto di progettazione di database, ma ho sempre sentito dire che questa è una pratica orribile. Quando vedo questo, di solito suggerisco frazionamento in due tabelle con una relazione uno a uno: uno contenente i dati utilizzati più di frequente, l'altro con i dati meno spesso utilizzati. Anche se, allo stesso tempo, c'è l'eventuale emissione di prestazione (meno raggiunge e simili). Quindi la mia domanda è questa:

Quando si tratta di banche dati su scala molto grande, c'è in realtà un vantaggio di avere una grande quantità di colonne, nonostante il fatto che questo di solito porta a valori molti NULL?

che è più di un calo di prestazioni:? Un sacco di colonne con un sacco di Null, o un minor numero di colonne con un sacco di join

È stato utile?

Soluzione

Il design del tavolo dipende l'entità di cui ha bisogno per memorizzare. Se tutti i dati appartiene insieme, poi 50 colonne (o anche 100) potrebbe essere la cosa giusta da fare.

Fino a quando il tavolo è normalizzato , non v'è alcuna regola generale per quanto riguarda le dimensioni, a parte dalla capacità di database e la necessità di ottimizzare.

Altri suggerimenti

Sono d'accordo con Oded. Ho visto le tabelle con 500 colonne in loro, e tutte le colonne di loro erano nel posto giusto. Basta prendere in considerazione il numero di fatti si potrebbe desiderare di memorizzare su un oggetto di tutti i giorni, e vedrete presto perché.

Se risulta scomodo per selezionare tutte le colonne, o per specificare le colonne da selezionare quando si è interessati solo in una piccola percentuale di loro, può risultare utile per definire una visione.

  

Come molte colonne è troppe colonne?

Quando si sente che non ha più senso o è diritto di aggiungere un'altra colonna.

In generale dipende dall'applicazione.

ODBC ha un limite di caratteri di 8000 .... in modo che sia un limite fisico oltre il quale le cose si fanno molto frustrante.

Ho lavorato su un tavolo che ha avuto 138 colonne .. era orribilmente scritto e avrebbe potuto essere normalizzato. Anche se questa banca dati sembrano del stata la creazione di qualcuno chiedendo perché ci sono convenzioni in progettazione di database e di decidere di testarli tutti in una volta.

Avendo molto ampia tavoli appiattito è abbastanza comune quando si entra in Data Warehousing e reporting server. Sono solo molto più veloce e mezzo che non c'è bisogno di memorizzare il vostro entirley base di dati nella RAM per le prestazioni.

Secondo la mia esperienza è meglio avere meno si unisce a quelli tendono ad accadere troppo spesso soprattutto nelle grandi database. Finché le tabelle del database sono progettati per memorizzare singola entità (studente, insegnante e così via) questo dovrebbe essere ok. In modo che questo sarà rappresentato come un oggetto in voi codice in seguito. Quindi, se si divide l'entità a diversi tavoli si dovrà utilizzare diversi si unisce al fine di riempire il vostro oggetto in seguito. Anche se si utilizza ORM per generare il livello di accesso ai dati (come LINQ in Net) è genererà classi separate per ogni tabella (ovviamente con un rapporto tra di loro, ma ancora) e questo sarà più difficile da usare.

Un'altra cosa è che è possibile specificare quali colonne per tornare nella vostra interrogazione e questo ridurrà i dati che viene passato per l'applicazione, ma se avete bisogno di una singola colonna da un altro tavolo si dovrà fare il join. E nella maggior parte dei casi, come hai tante colonne, allora la probabilità di avere grandi quantità di dati memorizzati nel db è alto. Quindi questo unirsi avrebbe danneggiato di più, rispetto ai NULL.

Ogni progetto che ho lavorato è diverso, quindi si dovrebbe trovare l'equilibrio per ogni storia.

Avere troppe colonne traduce in un sacco nulli (il male) e un oggetto ingombrante la tabella è mappato. Questo fa male leggibilità nell'IDE e ostacola la manutenzione (aumentando i costi di sviluppo). Se avete bisogno di velocemente si legge in alcuni casi utilizzare le tabelle per esempio denormalizzati utilizzati esclusivamente per la segnalazione o le query (ricerca per il modello "CQRS"). Sì "Persona" ha un milione di attributi, ma si può abbattere queste tabelle monothilic (precede progettazione normalizzazione) per abbinare gli enti più piccoli ( "Indirizzo", "telefono", "hobby") invece di aggiungere nuove colonne per ogni nuovo caso d'uso. Avendo oggetti di dimensioni più piccole (e tabelle) porta tanti vantaggi; permettono cose come test di unità, OOP, e le pratiche solido.

Inoltre, per quanto riguarda ad accumularsi erogatrice di evitare join, ritengo il guadagno di prestazioni da evitare unisce è perso attraverso manutenzione degli indici, ipotizzando un carico di lavoro tipico sia di lettura e scrittura. Aggiunta di indici sui campi per favorire le prestazioni di lettura potrebbe essere indicativo di una necessità di spostare i campi nella loro propria tabella.

  

che è più di un calo di prestazioni:   un sacco di colonne con un sacco di valori null, o   un minor numero di colonne con un sacco di join?

E 'puramente dipende dai dati memorizzati, gli indici si fanno e così via. Nessuno può garantire che si lavora meglio di un altro, senza sapere che cosa stai memorizzazione. In generale le regole di normalizzazione sarà "forza" si separare i dati a diversi tavoli e fkeys utente se avete un grande tavolo, ma non sono d'accordo che sempre si comporta meglio di un grande tavolo. Si può finire con 6-7 livello si unisce in decine di query che a volte causerà errori perché ci molte più possibilità di creare un errore nelle query più grandi che in quelle semplici.

Se pubblichi alcuni requisiti di ciò che si sta facendo forse ci può aiutare con la progettazione del DB correttamente.

E 'anche molto dipende dal caso d'uso per la vostra tavola. Se si desidera ottimizzare per la lettura allora potrebbe essere una buona idea per tenere tutto insieme in una tabella.

Nel mondo NO-SQL (Cassandra / HBase per esempio) non ci sono vincoli sul numero di colonne e in realtà è considerato una buona pratica di avere molte colonne. Questo deriva anche dal modo in cui è memorizzato (senza spazi vuoti). Vale la pena indagare.

Che bisogno attività richiede più di 60 colonne in qualsiasi insieme di dati, per non parlare di una tabella TSQL? Se v'è una tale esigenza di business, poi un pivot è in ordine, e le colonne dovrebbe essere righe. Ad esempio, nell'industria mineraria, ci possono essere 600 diverse misurazioni effettuate in un saggio. Il nome di ogni misura potrebbe essere un nome di colonna. Ma perché creare una tabella con 600 colonne e le righe di misure? Un geologo misurerebbe la miniera di ogni giorno, forse, e compilare il registro di 600 colonne su una riga. Che suona per me come il geologo perderà la sua mente, e lui non troverà un foglio di carta abbastanza a lungo. Forse un rotolo avrebbe funzionato, ma poi avrebbe dovuto srotolare il rotolo e rotolo su nuovamente.

E 'meglio utilizzare una singola tabella da cui è possibile evitare l'utilizzo di join durante l'interrogazione dipende dal fatto che le colonne sono di medesimo soggetto o entità diversa.

Per esempio, si supponga che si sta facendo un disegno di database per il flusso di lavoro in cui alcuni campi saranno a cura di lavoratori minori, e alcuni campi da parte dei lavoratori anziani. In questo caso è meglio avere tutte le colonne in una sola tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top