[firebase-br] SQL Elegante
francisco gamarra
francisco.gamarra em gmail.com
Qui Jul 20 14:44:59 -03 2006
Sou novo na lista mas tenho percebido q,
nas consultas q o pessoal tem postado
tenho percebido uma certa "deselegância"
nos scripts.
Gostaria então de abrir um tópico sobre
Elegância de SQL no FireBird, Padronização
em nome de campos de tabelas.
Desta forma o pessoal pode postar opiniões que favoreçam a todos.
* Uma "regra" bastante aceita entre os DBMenager's é a de que toda
tabela deve ter um campo id, e este campo deve realmente se chamar "id"
e deve ser o campo chave da tabela.
* Os campos que não podem se repetir devem utilzar o unique;
* Chaves compostas nem pensar, use o id e o unique;
* Outra interessante é toda tabela, com excessão das de cruzamento,
devem ter um campo nome, q deve ser o principal campo de consultas like.
* Se a tabela tem apenas um campo de valor, coloque o nome dele de valor
mesmo, o mesmo serve para data;
* Abreviações podem complicar. Cuidado com elas.
* Nome de tables e campos devem ser no singular;
* Alguns Exemplos de como eu crio minhas tables;
* Um campo referencial deve ter o mesmo nome da tabela de destino,
nada de usar a "deselegância" do "cod_pro" ou "cod_cli" (veja exemplo na
table venda)
create domain id int not null;
create domain ref int not null default 0;
create domain nome varchar(30) not null;
create domain date dete not null default 'now';
create domain valor numeric(10,2) not null default 0;
create table cliente (
id id primary key,
nome nome unique,
endereco varchar(50),
fone varchar(20)
);
create table vendedor (
id id primary key,
nome nome unique
);
create table produto (
id id primary key,
nome nome unique
);
/* esta é uma table de cruzamento, portanto não utiliza o campo nome*/
create table venda (
id id primary key,
cliente ref references cliente on update cascade on delete cascade,
produto ref references produto on update cascade on delete cascade,
vendedor ref references vendedor on update cascade on delete cascade,
data data,
valor valor
);
//perceba q todas as tabelas se parecem.
//O interessante é q qdo vc entiver criando uma classe
//vc vai poder colocar um padrão
type
TFBTable = class(TClientDataSet)
public
property id : integer read GetId write SetId;
property nome : string read GetNome write SetNome;
property data : TDate read GetData write SetData;
property valor : Currency read GetValor write SetValor;
end;//TFBTable
//perceba q fica muito + interessante, vc vai poder tratar todos objetos
igualemnte
* procure na sua aplicação colocar o nome do seu objeto de conexão (table,
query ou ClientDataSet)
o mesmo nome q ele possui no banco
procedure p;
begin
venda.fieldbyname('cliente').asInteger := cliente.id;
venda.fieldbyname('produto').asInteger
:= produto.id; venda.fieldbyname('venda').asInteger := venda.id;
end;
//em uma consulta sql também se torna + legivel
select
c.nome cliente,
p.nome produto,
v.nome vendedor,
sum(vd.valor) valor
from
cliente c,
produto p,
vendedor v,
venda vd
where
vd.cliente = c.id and
vd.produto = p.id and
vc.vendedor = v.id
group by
1,2,3
Espero estar ajudando a todos!!!
Um Abraço
Mais detalhes sobre a lista de discussão lista