[firebase-br] SQL Elegante

Luis Carlos Quinhone quinhone em uol.com.br
Qui Jul 20 19:57:38 -03 2006


Bom já que todos deram opnião, lá vai a minha:

Sempre crio assim:

tbcliente

cli_id
cli_nome
cli_endereco
cli_cpf
cli_fone
cli_email
cli_....

é isso aí

fui...



"francisco gamarra" 
<francisco.gamarra em gmail.com> escreveu na 
mensagem news:2cdd3ed60607201044r4106d90frbcc919085f71d293 em mail.gmail.com...
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