Sé que esto es tarde para el juego, y la pregunta ya ha sido respondida muy bien, pero quiero ofrecer mi opinión sobre el # 3 con respecto al prefijo de los nombres de columna.
Todas las columnas deben nombrarse con un prefijo que sea único para la tabla en la que se definen.
Por ejemplo, en las tablas "cliente" y "dirección", vamos con los prefijos de "cust" y "addr", respectivamente. "cliente" tendría "cust_id", "cust_name", etc. en él. "dirección" tendría "addr_id", "addr_cust_id" (FK de regreso al cliente), "addr_street", etc.
Cuando se me presentó por primera vez este estándar, estaba totalmente en contra de él; Odiaba la idea. No podía soportar la idea de todo ese tipeo y redundancia adicionales. Ahora tengo suficiente experiencia con eso que nunca volvería.
El resultado de hacer esto es que todas las columnas en el esquema de su base de datos son únicas. Hay un beneficio importante para esto, que supera todos los argumentos en su contra (en mi opinión, por supuesto):
Puede buscar en toda su base de código y encontrar de manera confiable cada línea de código que toque una columna en particular.
El beneficio del # 1 es increíblemente enorme. Puedo desaprobar una columna y saber exactamente qué archivos deben actualizarse antes de que la columna pueda eliminarse del esquema de forma segura. Puedo cambiar el significado de una columna y saber exactamente qué código necesita ser refactorizado. O simplemente puedo decir si los datos de una columna incluso se están utilizando en una parte particular del sistema. No puedo contar la cantidad de veces que esto ha convertido un proyecto potencialmente enorme en uno simple, ni la cantidad de horas que hemos ahorrado en el trabajo de desarrollo.
Otro beneficio relativamente menor es que solo tiene que usar alias de tabla cuando realiza una autounión:
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%';