Mysql
 sql >> Database >  >> RDS >> Mysql

Tabelle del database, più è meglio è?

Il problema qui è sottotipizzazione . Esistono tre approcci di base per gestire i sottotipi.

  1. Inserisci ogni tipo di record in una tabella completamente separata;
  2. Metti un record in una tabella padre e poi un record in una tabella di sottotipo; e
  3. Metti tutti i record in una tabella, con colonne nullable per i dati "facoltativi" (cioè cose che non si applicano a quel tipo).

Ogni strategia ha i suoi meriti.

Ad esempio, (3) è particolarmente applicabile se c'è poca o nessuna differenza tra i diversi sottotipi. Nel tuo caso, record di registro diversi hanno colonne aggiuntive se sono di un tipo particolare? Se non lo fanno o ci sono pochi casi in cui lo fanno, metterli tutti in una tabella ha perfettamente senso.

(2) è comunemente usato per una tabella Party. Questo è un modello comune nei CRM che coinvolge un oggetto Party padre che ha sottotipi per Persona e Organizzazione (l'organizzazione può anche avere sottotipi come Società, Associazione, ecc.). Persona e organizzazione hanno proprietà diverse (ad es. saluto, nomi dati, data di nascita, ecc. per Persona), quindi ha senso dividere questo aspetto piuttosto che utilizzare colonne annullabili.

(2) è potenzialmente più efficiente in termini di spazio (sebbene il sovraccarico delle colonne NULL nei moderni DBMS sia molto basso). Il problema più grande è che (2) potrebbe creare più confusione per gli sviluppatori. Otterrai una situazione in cui qualcuno ha bisogno di memorizzare un campo in più da qualche parte e lo colpirà in una colonna vuota per quel tipo semplicemente perché è più facile farlo che ottenere l'approvazione per i DBA per aggiungere una colonna (no, non sto scherzando ).

(1) è probabilmente lo schema meno utilizzato dei 3 nella mia esperienza.

Infine, la scalabilità deve essere considerata ed è probabilmente il caso migliore per (1). A un certo punto i JOIN non si ridimensionano in modo efficace e sarà necessario utilizzare una sorta di schema di partizionamento per ridurre le dimensioni della tabella. (1) è un metodo per farlo (ma un metodo grezzo).

Non mi preoccuperei troppo di questo però. In genere dovrai raggiungere centinaia di milioni o miliardi di record prima che diventi un problema (a meno che i tuoi record non siano davvero molto grandi, nel qual caso accadrà prima).