Sei que está atrasado para o jogo e a pergunta já foi respondida muito bem, mas quero oferecer minha opinião sobre o # 3 sobre o prefixo dos nomes das colunas.
Todas as colunas devem ser nomeadas com um prefixo exclusivo da tabela em que estão definidas.
Por exemplo, dadas as tabelas "cliente" e "endereço", vamos usar os prefixos "cust" e "addr", respectivamente. "customer" teria "cust_id", "cust_name" etc. etc. "address" teria "addr_id", "addr_cust_id" (retorno do cliente ao FK), "addr_street" etc. etc.
Quando fui apresentado a esse padrão pela primeira vez, eu estava contra ele; Eu odiava a ideia. Eu não suportava a idéia de toda essa digitação e redundância extras. Agora, já tive experiência suficiente para nunca mais voltar.
O resultado disso é que todas as colunas no esquema do banco de dados são exclusivas. Há um grande benefício nisso, que supera todos os argumentos contra ele (na minha opinião, é claro):
Você pode pesquisar toda a sua base de códigos e encontrar com segurança todas as linhas de código que tocam uma coluna específica.
O benefício do nº 1 é incrivelmente grande. Posso descontinuar uma coluna e saber exatamente quais arquivos precisam ser atualizados antes que a coluna possa ser removida com segurança do esquema. Posso alterar o significado de uma coluna e saber exatamente qual código precisa ser refatorado. Ou posso simplesmente dizer se os dados de uma coluna estão sendo usados em uma parte específica do sistema. Não posso contar o número de vezes que isso transformou um projeto potencialmente grande em um projeto simples, nem a quantidade de horas que economizamos no trabalho de desenvolvimento.
Outro benefício relativamente menor é que você só precisa usar aliases de tabela quando faz uma associação automática:
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%';