È necessario creare un database con il minor numero di tabelle possibile


52

Dovremmo creare una struttura di database con un numero minimo di tabelle?

Dovrebbe essere progettato in modo tale che tutto rimanga in un posto o va bene avere più tavoli?

In qualche modo influenzerà qualcosa?

Sto ponendo questa domanda perché un mio amico ha modificato la struttura del database in mediaWiki. Alla fine, invece di 20 tavoli, ne usava solo 8 e gli ci vollero 8 mesi per farlo (era il suo incarico universitario).

MODIFICARE

Concludo la risposta in quanto: le dimensioni delle tabelle NON contano, fino a quando il caso non è eccezionale; nel qual caso la denormalizzazione può aiutare.

Grazie a tutti per le risposte.


15
Il numero minimo di tabelle è semplice, basta serializzare il tutto su master_table (table_name, col_name, col_type, row_id, value).
Inca,

che cosa? non lo
capisco

12
Poiché ogni campo in un database è definito dalla combinazione di nome tabella, nome colonna, chiave primaria e valore, è sempre possibile ridurre il numero di tabelle denormalizzando in una singola tabella che memorizza proprio quello. Non molto utile, ma del tutto possibile.
Inca,

beh, stavo chiedendo il gusto di sapere, e se qualcosa è meno utile di quello esistente, perché preoccuparsi di cambiarlo? voglio dire fornirà qualche miglioramento in qualcosa? prestazione per esempio?
Shaheer,

1
@Hamza: potrebbe fornire prestazioni migliorate. Dipende davvero dalle circostanze specifiche. Non c'è quasi abbastanza informazioni qui per avere una risposta concreta.
FrustratedWithFormsDesigner,

Risposte:


155

IGNORA il numero di tabelle. Preoccupati di più per ottenere il design corretto. Se la tua principale preoccupazione è la quantità di tabelle, probabilmente non dovresti progettare sistemi di database.

Se il tuo amico aveva bisogno solo di 8 tabelle e il sistema funziona bene, allora 8 è il numero corretto e i restanti 12 potrebbero non essere stati necessari per qualsiasi cosa stesse facendo.

Eventuali eccezioni potrebbero essere ambienti peculiari che hanno limiti concreti sui numeri di tabella, ma non riesco a pensare a un esempio concreto di un tale sistema dalla cima della mia testa.


107
+1:If your major concern is quantity of tables, you should probably not be designing database systems.
Joel Etherton,

9
Corollario: una tabella di database non occupa [molto] spazio extra. Sono i dati che occupano spazio. Normalizzazione = più tabelle = meno ripetizione = meno spazio utilizzato. Cercando di ridurre al minimo il numero di tavoli non solo comprometti il ​​design, ma sprechi effettivamente spazio . Questo "golf da tavolo" è tutt'altro che negativo, a meno che alcuni dei tavoli non siano letteralmente ridondanti.
Aaronaught,

1
+1, anche se non credo che sappiamo abbastanza per dire che il numero corretto è 8 nel suo caso, poiché non possiamo confrontare gli schemi (l'originale potrebbe reggere meglio a un volume transazionale più elevato di quello che l'applicazione attualmente ha, per esempio)
Adam Robinson,

2
@Hamza: Ok, quindi potrebbe avere buone capacità di PHP e buone capacità di database e quel progetto potrebbe richiedere entrambi - ma non dare per scontato che avere uno implichi automaticamente l'altro. Molti sviluppatori possono avere una competenza ma non l'altra.
FrustratedWithFormsDesigner

4
@Tom Anderson - Quindi non dovresti ancora progettare sistemi di database.
Joel Etherton,


17

Le tabelle del database devono aderire al principio di responsabilità singola, proprio come dovrebbero le classi. Ogni tabella dovrebbe trattare non più di un gruppo di dati correlati per cominciare. Prestazioni a parte, questo rende l'intera bestia più facile da gestire, perché i tavoli stessi saranno più piccoli. Questo ti dà anche prestazioni migliori, perché le tabelle più piccole sono più veloci per la ricerca e l'unione.

Non preoccuparti del numero di tabelle più di quanto ti preoccupi per il numero di classi - non preoccuparti affatto. Concentrati sulla creazione di codice valido, pulito e leggibile, non su quanto spazio occupa. Rifattorizza in modo aggressivo una volta che hai un prodotto funzionante per renderlo migliore, e intendo anche il database! Vedrai colonne che dovrebbero trovarsi in altre tabelle, o che non sono necessarie, ecc. Profilo per vedere quali query impiegano più tempo e perché e come affrontare tali problemi se sono davvero un problema.


4
In un modello di dati normalizzato sì, questo è l'approccio migliore, tuttavia se il database è pensato per il reporting o principalmente per l'accesso in lettura, le tabelle "appiattite" denormalizzate funzioneranno meglio su grandi set di dati. Un numero inferiore di tabelle in questo caso comporterà meno join e prestazioni migliori.
maple_shaft

2
@maple Assolutamente d'accordo. Devi creare un profilo per determinare quali gruppi di dati devono essere raggruppati, quindi IMO è necessario iniziare normalizzato. YMMV, gli esperti probabilmente possono farlo in testa :) Jeff ha un post sulla denormalizzazione che potresti trovare interessante.
Michael K,

1
Post positivo e succinto, ho già letto questo! A volte puoi sfruttare il meglio di entrambi i mondi. Se il reporting non deve essere al 100% in tempo reale, mantenere due schemi, uno schema principale è lo schema transazionale normalizzato per l'uso dell'applicazione e l'altro uno schema denormalizzato che viene trasmesso in streaming regolarmente e su misura per l'accesso ai dati dei report.
maple_shaft

1
Maggiori informazioni sull'argomento con una spiegazione dello Star Schema: publib.boulder.ibm.com/infocenter/rbhelp/v6r3/…
maple_shaft

1
@maple_shaft, sono d'accordo sul fatto che i database di reportistica sono spesso denomalizzati per le prestazioni, ma non sono qualcosa su cui mi aspetterei che uno studente o un programmatore junior potesse accettarlo. So che certamente non permetterei ai miei data warehouse di essere gestiti da chiunque non avesse comprovata esperienza.
HLGEM,

7

Un database di produzione per un'applicazione aziendale può contenere centinaia o addirittura migliaia di tabelle. È necessario il numero di tabelle necessarie per i requisiti aziendali. Cercare di ridurre il numero di tabelle solo per avere meno tabelle di solito si tradurrà in un database che è più difficile da interrogare, ha problemi di integrità dei dati ed è molto più difficile da mantenere rispetto a un database normalizzato.

Ci sono momenti in cui è necessaria la denormalizzazione. Questo dovrebbe essere fatto solo da qualcuno che sa esattamente cosa sta facendo e perché. È molto semplice inventare denomalizzazione, quindi dovrebbe essere fatto solo da uno specialista di database o da uno sviluppatore di applicazioni senior con anni di esperienza nel database. Una persona inesperta dovrebbe sforzarsi di raggiungere almeno la terza forma normale (a meno che non si stia facendo un data warehousing che è un'area per la quale non prenderei in considerazione l'assunzione di una persona inesperta) in qualsiasi database che progetta.

Quando la gente dice di ridurre le tabelle perché i join sono costosi, generalmente sono ignoranti o hanno database mal progettati che mancano di indici critici o usano chiavi naturali di grandi dimensioni. I database relazionali sono progettati per utilizzare join e join possono essere abbastanza efficienti se gli FK sono correttamente indicizzati e usano piccoli campi su cui unire (gli interi sono i più efficienti). Noterai che le grandi aziende che dispongono di database di dimensioni terrabyte riescono in qualche modo a ottenere prestazioni eccellenti e utilizzare i join.

Nessun progettista di database serio cerca mai di ridurre il numero di tabelle solo perché desidera un numero inferiore di tabelle. Riduci il numero di tabelle perché i dati non sono più necessari o hai un problema di prestazioni che non puoi risolvere in altro modo (e ci sono molti modi per provare prima di correre il rischio estensivo per i tuoi dati di denormalizzare una tabella) .


Google ha progettato BigTable ed ha deliberatamente escluso i join poiché non è parallelizzabile.
Lie Ryan,

2
@Lie Ryan, BigTable è un caso speciale che NON è appropriato per la maggior parte delle applicazioni aziendali poiché l'integrità dei dati non è un grosso problema. Google non ha bisogno di molte regole aziendali complesse per la ricerca. Scommetto che la loro applicazione finanziaria aziendale non usa BigTable. Tuttavia, la maggior parte delle applicazioni aziendali che dispongono di database di grandi dimensioni possono, infatti, utilizzare i join e funzionare bene se il progettista è ben informato. I database aziendali hanno molti modi per migliorare le prestazioni (incluso il partizionamento) e quindi non è necessario perdere le funzionalità di integrità dei dati di un database relazionale.
HLGEM,

+1 per te, @HLGEM, sia per la risposta che per il commento; è un vero peccato vedere molti sviluppatori che saltano sul carro del database dei documenti perché pensano "join = slow", solo per andare a cercare di risolvere problemi relazionali risolti da database relazionali 20 anni fa.
Adam Robinson,

5

Poiché ogni campo in un database è definito dalla combinazione di nome tabella, nome colonna, chiave primaria e valore, è sempre possibile ridurre il numero di tabelle denormalizzando in una singola tabella che memorizza proprio quello. Non molto utile, ma del tutto possibile.

Le tabelle sono un livello astratto che aiuta a risolvere i problemi relativi alla gestione dei dati. Ecco perché sono stati creati. Ho fatto uno scherzo, ma capire che è possibile ridurre ogni serie di dati a una tabella principale indica immediatamente perché non dovresti: perché le tabelle ti portano qualcosa. A livello concettuale ti offrono una struttura che è più facile da capire per gli umani rispetto ai dati serializzati. A livello intermedio portano il concetto di normalizzazione: evitare il salvataggio di dati ridondanti e dare un unico punto per le modifiche, piuttosto che cambiare qualcosa in più punti. A livello tecnico i database portano la maggior parte delle cose che vuoi fare con i dati, numerosi strumenti e li hanno implementati e testati più di quanto probabilmente farai da solo. Pensa a tipi di dati, valori predefiniti, diritti utente, indici, vincoli di chiave esterna ecc. È stato testato, utilizzato da molti, ottimizzato, sottoposto a debug. (Non nella perfezione, ma comunque.)

Poiché un database è uno strumento, la cosa principale è decidere come utilizzare lo strumento. Il numero di tabelle non è importante. Ridurre al minimo è sempre possibile ma a scapito dei vantaggi. (Se leggi di più sulla normalizzazione, ti imbatterai nei pochi casi di denormalizzazione - ma anche in questo caso si tratta solo delle decisioni giuste piuttosto che ridurre ciecamente il numero di tabelle.)


grazie, è molto chiaro ora !, e mi hanno letto su normalizzazione btw, lo faccio ancora in database CakePHP, che incoraggia l'altro e un po 'diverso approccio.
Shaheer,

3

Dovresti usare il giusto numero di tabelle. In teoria si potrebbe accontentarsi di una singola tabella di tabella denormalizzando l'intero database, ma il database sarebbe inutilizzabile. Il tuo amico sembra che abbia troppo tempo a disposizione.


2

Avere il numero minimo di tavoli mi sembra un obiettivo molto particolare.

Certamente ridurre uno schema da 20 tabelle a 8 potrebbe essere una buona cosa (se fatto bene potrebbe ridurre i join e aumentare le prestazioni, rimuovere colonne inutilizzate e così via) ma potrebbe anche rendere più difficile la comprensione e il miglioramento in futuro.

A pensarlo in un altro modo pensi che la normalizzazione sia una buona cosa? La normalizzazione di solito porta a un numero maggiore di tabelle, ma porta anche a soluzioni più gestibili, riduzione della duplicazione dei dati e gestione dei dati più semplice.

Naturalmente può anche portare a prestazioni più lente (supponendo che il database denormalizzato sia stato ben progettato).

In definitiva, devi pensare a quali sono i tuoi requisiti in queste aree, ma come posizione di partenza predefinita direi un livello ragionevole di normalizzazione e quindi verificare se ciò sta causando problemi specifici in cui un minor numero di tabelle potrebbe essere una soluzione.


0

Il numero non è importante. Il design è. Guarda alcuni sistemi là fuori. Magento, PHPBB, ecc. Hanno decine di tabelle nei loro sistemi e funzionano perfettamente.


0

Insieme alle preoccupazioni per la normalizzazione e le prestazioni, è possibile utilizzare "che richiederà un'altra tabella" come modo per gestire l'ambito di un'applicazione. Questa funzione richiederà una nuova tabella e tutto il tempo, l'energia e gli sforzi per progettare, costruire, testare, gestire gli aggiornamenti e tutte le altre codifiche coinvolte. L'aggiunta di 5 campi a tabelle esistenti (ove appropriato) è molto più semplice di una tabella a 5 colonne.


0

Se si progetta un database con il tentativo di ridurre al minimo la creazione di tabelle, si vedrà presto l'improvvisa difficoltà ed errori nei propri modi.

Il conteggio delle tabelle non dovrebbe essere in primo piano durante la creazione di un progetto di database. Metti le cose dove devono andare logicamente e relazionalmente.


0

Penso che il numero di tabelle sia importante e possa avere un grande impatto sulle prestazioni se si sceglie di dividere i dati che dovrebbero, a tutti gli effetti, rimanere uniti, in più tabelle (vale a dire quindi si dovrebbe avere un database normalizzato). Di solito quando lo fai, sarai costretto a JOIN Operations (o equivalente non SQL) per ottenere tutti i dati di cui hai bisogno e per tabelle abbastanza grandi strutturate in questo modo, le prestazioni si riducono rapidamente.

Non entrerò nei dettagli, ma penso che il fatto molto reale che il numero di tabelle possa influenzare le prestazioni sia uno dei motivi per cui sono stati inventati database noSQL come Cassandra, Mongo e Google BigTable (sic!), ed è anche per questo che incoraggiano la de-normalizzazione dei dati (e di conseguenza evitando un gran numero di tabelle / raccolte, ecc.).

Lo stesso si può dire per i server di ricerca come Solr di Apache che non incoraggiano o facilitano facilmente la suddivisione dei documenti in più "tabelle" o "tipi di voci", incoraggiandoti invece ad avere uno schema "uno che comprende tutti" che ha campi comuni a tutti i tipi di documenti che si desidera indicizzare (e di conseguenza evitare di dover eseguire operazioni simili a JOIN).

Non sto dicendo che il semplice fatto di avere x table in uno schema lo renderà necessariamente più lento di uno schema con x / 2 table tutte le volte, ma ci sono alcuni contesti in cui può portare a rallentamenti dovuti a conseguenti operazioni extra necessarie per aggregare i dati in tutte quelle tabelle. Continuando su questo, non penso che sia giusto dire "qualsiasi numero di tabelle e l'estrema normalizzazione dei dati non ha alcun impatto sulle prestazioni".


0

Lo zio Bob sosterrebbe che More è più semplice.

Vedi http://c2.com/cgi/wiki?FearOfAddingTables

"un buon design è generalmente semplificato aggiungendo tabelle"

Credo che quasi tutte le entità siano molte-a-molte, il che richiede più tabelle.

Crea una tabella dei paesi con al suo interno il codice del continente. Oh, non puoi perché in realtà ci sono 8 paesi transcontinentali. Lo stesso vale per le valute. Panama ne usa due.


-2

Quindi la risposta è SÌ.

Ma dipende qual è il vero significato del numero "minimo" di tabelle.

Ad esempio (un anti-esempio).

Se avrò i prossimi oggetti

  1. utenti
  2. i clienti

ed entrambi condividono gli stessi stati (campi) e non ci sono restrizioni di sicurezza, quindi è più adatto a fare un'unica tabella

  1. table_persons

piuttosto due tavoli diversi

  1. table_users
  2. table_customers

il contro è che nei table_persons dovremo aggiungere un nuovo campo (type_of_person).

Un altro errore (errore se non è proprio necessario) è quello di "dividere" una tabella, leggi come: separare una singola tabella in due.

  1. table_persons

in due tavoli

  1. table_info_persons
  2. table_extra_info_persons

perché stai forzando alcune query a unire due tabelle ed è male.


hey la tua risposta è molto descrittiva e d'aiuto, grazie
Shaheer,

2
Questo mi dà flashback alla mia prima applicazione aziendale e al database dietro di essa e quanto di un incubo il DBA sia riuscito a diventare un nazista su cose come questa. Non metterei mai assolutamente insieme clienti e utenti che sono entità aziendali completamente disparate.

-1: utenti e clienti hanno campi diversi; Se non in questo momento, avranno ad un certo punto in futuro. Quindi meritano tabelle separate.
Sjoerd,

1
@Sjoerd, @Chris: anche se spesso può essere così, non è necessariamente vero. Cose del genere dipendono dall'applicazione. Detto questo, sono d'accordo con il sentimento. Troppo spesso gli sviluppatori di database vedranno "nomi di campi comuni" significa che sono gli stessi dati. Questo diventa particolarmente facile da fare quando si guarda prima il database dall'ORM (in altre parole, all'indietro). Mentre i concetti di OO possono essere modellati nel database, i database sono righe e relazioni, non oggetti .
Adam Robinson,

1
+1 per "i database sono righe e relazioni, non oggetti", lo aggiungerò alle mie citazioni preferite!
Shaheer,
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.