Recentemente, tenho usado uma camada de abstração de banco de dados criada por uma estrutura da web Python chamada web2py ( clique para obter a sintaxe DAL ). Eles incluem a opção de incluir suas restrições na CREATE TABLE
instrução.
Enquanto tomava o MOOC "Introduction to Databases" de Stanford , o SQL Standard foi mencionado como suportando qualquer consulta dentro da instrução como restrições (essencialmente substituindo um caso de uso importante para gatilhos).CREATE TABLE
Qual é a melhor prática?
Abaixo está um exemplo simples de inclusão de restrições em CREATE TABLE
instruções; em vez de através de ALERT TABLE
e/ou CREATE TRIGGER
declarações:
CREATE TABLE Place (
address VARCHAR2(40),
CONSTRAINT place_pk
PRIMARY KEY (address)
);
CREATE TABLE Company (
c_name VARCHAR2(40),
CONSTRAINT company_pk
PRIMARY KEY (c_name)
);
CREATE TABLE Employee (
e_name VARCHAR2(40),
tax_no NUMBER,
salary NUMBER(19,4),
sex CHAR,
birthdate DATE,
address VARCHAR2(40),
CONSTRAINT employee_pk
PRIMARY KEY (tax_no),
CONSTRAINT address_fk
FOREIGN KEY (address) REFERENCES Place(address),
CHECK (address IS NOT NULL)
);
CREATE TABLE CompanyEmployee (
employee_id NUMBER,
company_id VARCHAR2(40),
CONSTRAINT unique_employee_id
UNIQUE(employee_id),
CONSTRAINT employee_id_fk
FOREIGN KEY (employee_id) REFERENCES Employee(tax_no),
CONSTRAINT company_id_fk
FOREIGN KEY (company_id) REFERENCES Company(c_name),
CONSTRAINT company_employees_pk
PRIMARY KEY (employee_id, company_id)
);
BTW: Você notará que estou usando CAPS para palavras-chave, CamelCase maiúsculo para nomes de tabelas e under_score inferior para nomes de atributos e gatilhos. Isso é uma boa prática? - Sinta-se à vontade para criticar meus estilos de recuo e uso de espaços em branco também :)
Eu pessoalmente acho que é uma questão de gosto.
Os scripts em que as restrições são definidas por meio de uma
ALTER
instrução são um pouco mais flexíveis, pois você não precisa se preocupar com a ordem de criação (primeiro crie todas as tabelas, depois todas as PKs e depois todas as FKs).No entanto, os scripts com restrições incorporadas são mais "independentes". Você não precisa procurar outros locais no script para localizar as definições de restrição.
Usar maiúsculas e minúsculas não faz nenhuma diferença, pois tudo será convertido para maiúsculas de qualquer maneira (porque você não usou
"
para citar seus nomes - o que é uma coisa boa).Com relação ao recuo e espaço em branco: novamente, isso é gosto completamente pessoal. Faça do jeito que você acha que ainda pode entender isso daqui a 6 meses. O mais importante é ser consistente (e talvez documentar seu estilo em algum lugar na documentação do projeto, para que novos membros possam entender e usar a mesma formatação)
Em um banco de dados de nível corporativo, você pode defender a divisão de suas restrições de maneira a facilitar o recarregamento de muitos dados. eu tenho visto
Cada um deles estaria em um ou mais arquivos. Todos esses arquivos estariam sob controle de versão.
A lógica é que é mais rápido carregar muitos dados e , em seguida, aplicar as restrições do que carregar muitos dados depois de declarar as restrições e os índices. Com um pouco de manipulação de texto em um makefile, você ainda pode gerar uma instrução CREATE TABLE "completa" com todas as restrições incluídas.