[firebase-br] SQL Elegante
Fabio
clicklist em gmail.com
Qui Jul 20 22:40:26 -03 2006
Quanto a elegancia do codigo, acho apenas que os nomes devem ser
legiveis. Reflita um pouco no seguinte:
- Se eu ficar 1 ano sem ver meu banco de dados, e ver aquele tal campo
INSC_EST_EMP_ETC_E_TAL vai fazer sentido ou ser alto explicativo?
- Nomes de tabelas no plural e campos no singular.Lembre-se de falar
em portugues simples "SELECT * FROM CLIENTE" é igual a "SELECIONE TAL
CLIENTE DA TABELA DE CLIENTES". Afinal um tabela é um coletivo de registros
- Sobre chaves compostas, eu prefiro uma chave simples mesmo em
tabelas cruzadas, mas confesso que não tem MUITA utilidade pratica... uso
porque sou chato mesmo ;-)
- Eu nao gosto de siglas, os bancos modernos permitem nomes longos,
entao Codigo_Cliente é um nome aceitavel. Porem, é preciso ver as diferenças
entre bancos. No Sql Server é melhor CodigoCliente, mas o Firebird tem
estetal problema com maiusculas, entao nem pensar. Quanto a nomes de tabelas
longos, sem problemas tambem por que sempre podemos usar aliases
- Outra dica é nomear as chaves estrangeiras diferentemente das
respecitvas chaves primarias, evitando aquele erro chato num JOIN que o BD
nao sabe de qual tabela é o campo que vc esta se referenciando por ter nomes
iguais
[]'s
Fábio Alves
On 7/20/06, francisco gamarra <francisco.gamarra em gmail.com> wrote:
> 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
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
Mais detalhes sobre a lista de discussão lista