In molti progetti di database relazionali ci sono campi a cui si fa riferimento in altre tabelle.
Ad esempio, prendere in considerazione una tabella utente con un nome utente univoco e una seconda tabella che memorizza i dati dell'indirizzo.
Un possibile layout, che direi è l'approccio comune, poiché ho osservato nella maggior parte dei software, è utilizzare ID di incremento automatico come questo:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
Questo è il modo in cui lo facevo e come l'ho visto nella maggior parte dei casi.
Un altro modo sarebbe:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
Qui memorizziamo il nome utente completo anche nella tabella adressdata.
Per me questo ha i seguenti vantaggi:
È possibile selezionare il nome utente immediatamente dalla tabella senza la necessità di unirlo a un'altra tabella. In questo esempio questo è da un punto di vista dell'applicazione probabilmente non così rilevante, ma è solo un esempio.
Potrebbe essere più semplice ridimensionare il database in un ambiente di replica master-master, poiché non vi sono conflitti per l'incremento automatico.
Ma anche gli svantaggi:
- I requisiti di spazio per l'indice e i dati (ma probabilmente più rilevante sarà l'indice) sul campo nella seconda tabella sono più elevati.
- Una modifica del nome utente dovrebbe propagarsi a tutte le tabelle, il che richiede più risorse rispetto alla semplice modifica in una tabella e lascia gli ID così come sono.
A mio avviso, è molto più semplice lavorare con i campi di testo e non usare gli ID di incremento, e i compromessi sono minimi e nella maggior parte delle applicazioni non rilevanti.
Naturalmente alcuni oggetti SONO identificati con un numero crescente per loro natura (ad esempio i post dei forum dovrebbero ricevere un ID incrementale perché probabilmente non esiste un altro campo univoco come titolo o simili).
Ma prima di iniziare a progettare i layout del mio database in un modo completamente diverso, vorrei sapere se ci sono cose a cui non ho pensato.
Ci sono delle migliori pratiche?
Ci sono pro / contro che non pensavo e il cui effetto potrebbe sorgere in un momento successivo?
Come progettate personalmente i database relativi ai punti precedenti e perché?