= Padrões para Banco de Dados = == Normas gerais == * Use letras maiúsculas para palavras reservadas (sintaxe) SQL. * Use letras minúsculas para elementos de negócio (particulares do projeto em desenvolvimento): * elimina a dúvida sobre qual a "caixa" correta assim como outros erros relacionados. * aumenta a velocidade de escrita e exatidão. * diferencia nomes de tabelas e campos da sintaxe com caixa alta do SQL. * Separe palavras e prefixos com "_" (underline), nunca use espaços. * melhora legibilidade (ex: nome_livro). * evita a necessidade de envolver nomes com colchetes (ex: [account type] ou 'account type'). * maior independência de plataforma. * Evite usar números. * Procure identar os comandos SQL, principalmente se os mesmos forem extensos. * Melhora a legibilidade do código {{{ Exemplo sem identação: SELECT pk_address, fk_contact, location, complement FROM contaccenter_address WHERE fk_address_type = 2 AND country = 'Brazil'; Exemplo com identação: SELECT pk_address, fk_contact, location, complement FROM contaccenter_address WHERE fk_address_type = 2 AND country = 'Brazil'; }}} == Tabelas == * Escolha nomes sem ambiguidade, curtos, não usando mais que duas palavras. * distingue tabelas facilmente; * facilita nomear campos únicos assim como tabelas de metadados. * Use nomes no singular, nunca plural. * promove consistência com a nomenclatura de campos de chave primárias e tabelas de metadados; * garante ordenação alfabética de uma tabela antes de suas tabelas de metadados ou relacionadas; * evita confusão de regras de plural do português ou inglês; * estrutura SQL mais "gramatical" (ex: SELECT activity.activity_name --ao invés de-- SELECT activities.activity_name). * Evite nomes com acrônimos, abreviados ou concatenados. * provê arquitetura auto-documentável; * facilita a leitura e o entendimento, tanto para desenvolvedores quanto para não-desenvolvedores. * Prefixe as tabelas de metadados (lookup tables) com o nome das tabelas a que elas se relacionam. * agrupa tabelas relacionadas (ex: activity_status, activity_type, etc); * evita conflitos de nomes de tabelas de metadados de diferentes entidades. * Para uma tabela associativa (n:n), concatene o nome das duas tabelas envolvidas: * expressa o propósito de composição da tabela; * esta regra não se aplica quando houver mais de uma tabela associativa para as mesmas entidades originais. * Crie comentários para a tabela e para as colunas: * facilita a compreensão do propósito da tabela; * explica o conteúdo presente em uma coluna. == !Campos/Colunas == * A chave primária deve ter o nome da tabela com o prefixo "pk_". * permite que a chave primária seja deduzida ou lembrada a partir apenas do nome da tabela (ex: chave primária da tabela "language" seria "pk_language". * consistência com o nome da chave primária. * evita a necessidade de usar apelidos (alias) na programação. * para tabelas que possuem mais de um campo compondo a chave primária, essa regra não se aplica, sendo que os campos poderão continuar tendo o prefixo "pk_", porém o nome que sucede o prefixo "pk_" terá que ser outro diferente do nome da tabela. Ex: tabela "config", PK = pk_application + pk_config_name; * quando a chave primária é composta por campos FK, os mesmos permanecerão com os nomes dos campos PK das tabelas relacionadas. Ex: tabela "application_log", a PK seria pk_application e pk_item_log, onde o campo pk_application é a FK que vem de outra tabela e o campo pk_item_log é da própria tabela em questão, e ambos juntos formam a PK. * Chaves estrangeiras devem ter o mesmo nome das chaves primárias às quais elas se referem. * faz com que as tabelas às quais elas se referem fique óbvio; * se houver múltiplas chaves estrangeiras se referenciando a uma mesma tabela, sufixe o campo da chave estrangeira com um nome descritivo apropriado (fk_nome_campo_adjetivo, ex: fk_funcionario_titular, fk_funcionario_substituto). == Restrições (Constraints) == * O nome da chave primária deverá ser formado pelo nome da tabela, acrescido do sufixo "_pkey". (Ex: tabela "emailadmin_domains", chave "emailadmin_domains_pkey"). * O nome das chaves estrangeiras deverão ser formados pelo nome da tabela + nome do campo + sufixo "_fkey". (Ex: emailadmin_domains_fk_manager_fkey). == Índices == * O nome de um índice deverá ser formado pelo nome da tabela + campo indexado + sufixo _idx. (Ex: accounts_name_idx).