mysql - quante colonne sono troppe?


111

Sto impostando una tabella che potrebbe avere più di 70 colonne. Ora sto pensando di suddividerlo poiché alcuni dei dati nelle colonne non saranno necessari ogni volta che si accede alla tabella. Poi di nuovo, se lo faccio mi rimane la necessità di utilizzare i join.

A che punto, se esiste, viene considerato troppe colonne?


6
Non dobbiamo usare SELECT * tutto il tempo. Abbiamo sempre la possibilità di selezionare solo le colonne di cui abbiamo bisogno per una determinata situazione.
APC

3
70 colonne ?! Quanti di questi non possono essere nulli?
OMG Ponies

1
La grande domanda è ... stai normalizzando i tuoi tavoli? 70 è una quantità insolita a meno che tu non stia deliberatamente denormalizzando per le prestazioni (pochissime cose hanno 70 attributi unici). Se stai denormalizzando per motivi di prestazioni, sarei d'accordo con ChssPly76 sul fatto che puoi usare qualsiasi cosa il database ti permetta di farla franca.
Godeke

2
@KM. dovrebbe essere uno scherzo? Sono nuovo in MySQL e non riesco a ottenerlo, intendevi che JOIN è una buona cosa o qualcosa da cercare di evitare?
Elia Iliashenko

2
Per quanto i join siano una parte fondamentale di SQL, l'unione per il bene dell'unione probabilmente ridurrà le prestazioni e la manutenibilità per qualsiasi applicazione tu abbia.
jeteon

Risposte:


142

È considerato troppe una volta che supera il limite massimo supportato dal database .

Il fatto che non sia necessario che ogni colonna venga restituita da ogni query è perfettamente normale; ecco perché l'istruzione SELECT ti consente di nominare esplicitamente le colonne di cui hai bisogno.

Come regola generale, la struttura della tabella dovrebbe riflettere il modello di dominio; se hai davvero 70 (100, cosa hai) attributi che appartengono alla stessa entità, non c'è motivo di separarli in più tabelle.


29
@ KM - ecco perché ho detto "attributi appartenenti alla stessa entità sul modello di dominio". Un numero elevato di colonne nella tabella NON la rende denormalizzata; ciò che conta è ciò che dette colonne rappresentano. Inoltre, sebbene la normalizzazione sia sicuramente una buona cosa, NON è una soluzione a tutti i problemi della vita. Domanda trucco: pensi che il numero di voti accanto alla domanda / risposta SO sia calcolato come select count(*) from votesogni volta o pensi che forse sia denormalizzato? Questo rende il database SO cattivo e Jeff Atwood pazzo?
ChssPly76,

@ ChssPly76, è un database relazionale non un modello a oggetti. ci sono tabelle, righe e colonne, lavora entro quel vincolo se vuoi le massime prestazioni, imita i tuoi oggetti per comodità per il bene delle prestazioni. Quindi ogni informazione su una persona dovrebbe essere archiviata nella stessa riga? no, suddividili e raggruppali in diverse tabelle (usando il mio esempio dal mio commento precedente): "Person", "Activities" "HealthRecords". La memorizzazione di una SOMMA per motivi di prestazioni è un problema completamente diverso rispetto alla conservazione di tutti i dati in 70 colonne per evitare join.
KM.

20
"NumberOfTeethPulled" dovrebbe essere una parte del record di Person? No, probabilmente non dovrebbe essere memorizzato affatto: riceverai queste informazioni da "ToothExtractionRecord" se il tuo modello di dominio richiede un tale livello di dettaglio. Ma questo è il TUO (e, oserei dire, piuttosto artificioso) esempio - non ha nulla a che fare con il mio punto: un numero elevato di colonne in una tabella NON significa che la tabella è denormalizzata. Pensa a contratti immobiliari / ordini di acquisto / altri documenti finanziari solo per citare alcuni esempi. Possono essere ulteriormente suddivisi in più tabelle? Sì. Qualche motivo per farlo? Non proprio.
ChssPly76,

1
+1, è stato divertente. Se stai creando un'altra tabella e sarà solo una relazione 1: 1, probabilmente dovresti semplicemente includerla nella tabella principale. Non risparmierà spazio, non funzionerà molto meglio se non richiedi i dati rispetto a non essere affatto nella tabella. L'unico motivo legittimo che mi viene in mente in questo momento è se ci sono informazioni sensibili come SSN, informazioni sulla carta di credito, ecc ...
Vandel212

1
Se una tabella ha 15 colonne e un'altra ha 300 colonne, la chiave primaria delle due tabelle è la stessa. Seleziona una colonna nelle due tabelle, le prestazioni saranno significativamente diverse?
un'offerta non può rifiutare

28

Ci sono alcuni vantaggi nel dividere la tabella in più colonne con meno colonne, che è anche chiamata Partizionamento verticale . Eccone alcuni:

  1. Se hai tabelle con molte righe, la modifica degli indici può richiedere molto tempo, poiché MySQL deve ricostruire tutti gli indici nella tabella. La suddivisione degli indici su più tabelle potrebbe renderlo più veloce.

  2. A seconda delle query e dei tipi di colonna, MySQL potrebbe scrivere tabelle temporanee (utilizzate in query di selezione più complesse) su disco. Questo è un male, poiché l'I / O del disco può essere un grosso collo di bottiglia. Ciò si verifica se nella query sono presenti dati binari (testo o BLOB).

  3. Una tabella più ampia può rallentare le prestazioni delle query.

Non ottimizzare prematuramente, ma in alcuni casi puoi ottenere miglioramenti da tabelle più strette.


5
Perché MySQL deve ricostruire tutti gli indici nella tabella se solo uno viene modificato?
Petr Peller

Mi chiedevo lo stesso. Perché MySQL ricostruisce tutti gli indici nella tabella? La dichiarazione di cui sopra è corretta?
maggio

13

Sono troppe quando viola le regole della normalizzazione. È piuttosto difficile ottenere così tante colonne se stai normalizzando il tuo database. Progetta il tuo database per modellare il problema, non attorno a regole o idee artificiali sull'ottimizzazione per una piattaforma db specifica.

Applica le seguenti regole alla tabella ampia e probabilmente avrai molte meno colonne in una singola tabella.

  1. Nessun elemento ripetuto o gruppo di elementi
  2. Nessuna dipendenza parziale da una chiave concatenata
  3. Nessuna dipendenza da attributi non chiave

Ecco un link per aiutarti.


17
It is pretty hard to get that many columns if you are normalizing your database.Non così difficile come sembra.
Petr Peller

5
Sicuramente non così difficile. Le persone non sembrano capire veramente le forme normali intorno a queste parti qui. Puoi avere 10000 colonne e ANCORA essere normalizzato (anche nella forma normale più alta).
Hejazzman

2
@foljs Ed è proprio qui che entra in gioco la pratica accettata della denormalizzazione. Se ti trovi a un incrocio e un'auto sta per entrarti dentro, sarebbe stupido aspettare che il semaforo diventi verde. Devi toglierti di mezzo. Mentre passare attraverso il semaforo rosso potrebbe non essere tecnicamente legale, stai facendo quello che dovresti ovviamente fare data la situazione = denormalizzazione
user3308043

3
Mi hai perso quando hai iniziato a parlare di auto. Non ho idea di quale sia la rilevanza.
JohnFx

2
Tuttavia, come si eseguono query complesse in questo scenario con una singola tabella di dati, non è possibile, è necessario fare molto affidamento sul linguaggio di programmazione e su una varietà di altre cose per farlo funzionare! Quindi, potrei anche tornare ad avere una tabella con 170 colonne, perché avere query "JOIN" e una programmazione extra complessa che richiede per far funzionare tabelle separate mi sembra una perdita di tempo. Immagino di essere un grande fan del principio KISS.
Vlad Vladimir Hercules

0

Non è un problema a meno che tutti gli attributi non appartengano alla stessa entità e non dipendano l'uno dall'altro. Per semplificarti la vita puoi avere una colonna di testo con un array JSON memorizzato al suo interno. Ovviamente, se non hai problemi a ottenere tutti gli attributi ogni volta. Anche se questo annullerebbe completamente lo scopo di memorizzarlo in un RDBMS e complicherebbe notevolmente ogni transazione del database. Quindi il suo approccio non consigliato da seguire in tutto il database.


0

Avere troppe colonne nella stessa tabella può causare enormi problemi anche nella replica. Dovresti sapere che le modifiche che avvengono nel master si replicheranno allo slave .. ad esempio, se aggiorni un campo nella tabella, l'intera riga sarà w

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.