So che questo è in ritardo al gioco, e alla domanda è già stata data una risposta molto buona, ma voglio offrire la mia opinione su # 3 per quanto riguarda il prefisso dei nomi delle colonne.
Tutte le colonne devono essere denominate con un prefisso univoco per la tabella in cui sono definite.
Ad esempio, date le tabelle "cliente" e "indirizzo", andiamo rispettivamente con i prefissi di "cust" e "addr". "cliente" avrebbe "cust_id", "cust_name", ecc. al suo interno. "address" avrebbe "addr_id", "addr_cust_id" (FK torna al cliente), "addr_street", ecc. in esso.
Quando mi è stato presentato per la prima volta questo standard, sono stato messo a dura prova contro di esso; Ho odiato l'idea. Non potevo sopportare l'idea di tutta quella digitazione e ridondanza in più. Ora ho avuto abbastanza esperienza con esso che non ci tornerò mai più.
Il risultato è che tutte le colonne nello schema del database sono uniche. C'è un grande vantaggio in questo, che vince su tutti gli argomenti (a mio avviso, ovviamente):
Puoi effettuare ricerche nell'intera base di codici e trovare in modo affidabile ogni riga di codice che tocca una determinata colonna.
Il vantaggio del n. 1 è incredibilmente enorme. Posso deprecare una colonna e sapere esattamente quali file devono essere aggiornati prima che la colonna possa essere rimossa in modo sicuro dallo schema. Posso cambiare il significato di una colonna e sapere esattamente quale codice deve essere refactored. Oppure posso semplicemente dire se i dati di una colonna vengono persino utilizzati in una particolare porzione del sistema. Non posso contare il numero di volte in cui questo ha trasformato un progetto potenzialmente enorme in un progetto semplice, né la quantità di ore che abbiamo risparmiato nel lavoro di sviluppo.
Un altro vantaggio relativamente minore è che devi usare solo alias di tabella quando esegui un self join:
SELECT cust_id, cust_name, addr_street, addr_city, addr_state
FROM customer
INNER JOIN address ON addr_cust_id = cust_id
WHERE cust_name LIKE 'J%';