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

Differenza tra la struttura a due tabelle

Antimodello?

In casi comuni, la seconda tabella è anti-pattern nel contesto della progettazione di database. E, ancora di più, ha un nome specifico:Entity-Attribute-Value (EAV). Ci sono alcuni casi in cui l'utilizzo di questo design è giustificato, ma sono casi rari e anche lì può essere evitato.


Perché EAV è cattivo

Supporto per l'integrità dei dati

Nonostante il fatto che tale struttura sembri essere più "flessibile" o "avanzata", questo design ha dei punti deboli.

  • Impossibile rendere obbligatori gli attributi . Non è possibile rendere obbligatori alcuni attributi, poiché l'attributo è ora archiviato come riga - e l'unico segno che l'attributo non è impostato - è che la riga corrispondente è assente nella tabella. SQL non ti consentirà di creare tale vincolo in modo nativo, quindi dovrai verificarlo nell'applicazione e, sì, interroga la tua tabella ogni volta
  • Miscelazione di tipi di dati . Non sarai in grado di utilizzare i tipi di dati standard SQL. Perché la tua colonna del valore deve essere un "super-tipo" per tutti i valori memorizzati in essa. Ciò significa che in generale dovrai archiviare tutti i dati come stringhe grezze . Quindi vedrai quanto è doloroso lavorare con le date come con le stringhe, trasmettere i tipi di dati ogni volta, controllare l'integrità dei dati, ecc.
  • Impossibile applicare l'integrità referenziale . In una situazione normale, puoi utilizzare la chiave esterna per limitare i tuoi valori a quelli definiti nella tabella padre. Ma non in questo caso, perché l'integrità referenziale viene applicata a ogni riga nella tabella, ma non per i valori di riga. Quindi - perderai questo vantaggio - ed è uno dei fondamentali in relazione a DB
  • Impossibile impostare i nomi degli attributi . Ciò significa che non puoi limitare correttamente il nome dell'attributo a livello di DB. Ad esempio, scriverai "customer_name" come nome dell'attributo nel primo caso - e un altro sviluppatore lo dimenticherà e utilizzerà "name_of_customer" . E... va bene, DB lo passerà e finirai con ore spese a eseguire il debug di questo caso.

Ricostruzione riga

Inoltre, la ricostruzione delle righe sarà terribile nel caso comune. Se hai, ad esempio, 5 attributi, saranno 5 self-table JOIN -S. Peccato per un caso così semplice - a prima vista -. Quindi non voglio nemmeno immaginare come manterrai 20 attributi.


Può essere giustificato?

Il mio punto è - no. In RDBMS ci sarà sempre un modo per evitarlo. È orribile. E se si intende utilizzare EAV, la scelta migliore potrebbe essere non relazionale banche dati.