Jump to content
Carlos Rocha

Optimização de tabelas

Recommended Posts

Carlos Rocha

Fiz uma modificação, mas ainda acho que não é o ideal.

Fiz uma imagem que anexei à essa dúvida para se ter uma ideia de aonde quero chegar

imagem.png

Temos 3 classes: Cliente, Fornecedor e Vendedor.

Acontece que temos duas divisões para essas classes:

A)

Todo Cliente pode ser um Vendedor e um Fornecedor

Todo Vendedor pode ser um Cliente e um Fornecedor

......

B)

Todo Cliente ou Fornecedor pode ser Pessoa Física ou Juridica. Mas todo Vendedor precisa ser Pessoa Física(Ou não no caso de uma revenda?)

Veja a modificação:

create table Pessoa
{
 idPessoa					int(4) not null unsigned auto_increment,
 dctoTipoPessoa		 char(1) not null, //f(física, j(juridica)
 nome						  varchar(100) not null unsigned,
 endereco				   int(4) not null,
 telefone					varchar(11) not null,
 celular					  varchar(12),
 bloqueio				   char(1) not null,
 senha					  varchar(12) not null,
 PRIMARY KEY (idPessoa),
 FOREIGN KEY (endereco) REFERENCES Endereco(idEndereco)
}

Mas veja que aqui eu faço referencia, ou seja, eu faço uma associação (simples) entre Cliente e Endereco.

Isso é ruim? Tem como melhorar?

create table Vendedor
{
 idPessoa			   int(4) not null unsigned,
 dctoValorPessoa		varchar(14) not null unsigned,
 FOREIGN KEY (idPessoa) REFERENCES Pessoa(idPessoa)

}

create table Cliente
{
 idPessoa			   int(4) not null unsigned,
 dctoValorPessoa		varchar(14) not null unsigned,
 FOREIGN KEY (idPessoa) REFERENCES Pessoa(idPessoa)

}

create table Fornecedor
{
 idPessoa			   int(4) not null unsigned,
 dctoValorPessoa		varchar(14) not null unsigned,
 FOREIGN KEY (idPessoa) REFERENCES Pessoa(idPessoa)

}


Create table Endereco
{
 idEndereco			   int(4) not null unsigned auto_increment,
 cep					  
 referenciaEndereco	   varchar(8) not null, // rua, avenida, praça......... E aqui eu deveria criar uma nova tabela para esse campo?
 endereco				 varchar(100) not null,
 numero				   int(5) not null,
 complemento			  varchar(100),
 bairro				   varchar(100) not null,
 cidade				   varchar(100) not null, //ou int(4) criando uma nova tabela cidades?
 estado				   char(02) not null, //ou int(4) criando uma nova tabela estados?
 PRIMARY KEY(idEndereco)
}

Create table Produto
{
 idProduto				int(4) not null unsigned auto_increment,
 idFornecedor			 int(4) not null,
 idCategoria			  int(4) not null,
 idSubcategoria		   int(4) not null,
 tipoUnidade			  varchar(6) not null // Ou deveria criar uma nova tabela para unidade do tipo: kg, fardo, unidade, tonelada.....
 valorUnidade			 float(4,2) not null,
 nome					 varchar(100) not null unsigned,
 freteGratis			  char(1) not null,
 preco					float(6,2) not null,
 descricao				text not null,
 PRIMARY KEY(idProduto),
 FORHEIGN KEY(idFornecedor) REFERENCES Fornecedor(idFornecedor),
 FORHEIGN KEY(idCategoria) REFERENCES Categoria(idFornecedor),
 FORHEIGN KEY(idSubcategoria) REFERENCES Subcategoria(idSubcategoria)
}

Aqui na tabela produto eu tenho 3 referencias à outras tabela. Isso é ruim ou bom? Se ruim, como melhorar?

Minha Idéia aqui é tentar colocar minhas tabelas(classes UML) na 3ª Forma normal optimizando ao máximo(que der).

Gostaria de orientações de vocês.

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
Rui Carlos

Em vez de teres a tabela Vendedores, Clientes, e Fornecedores, um colocaria simplesmente um campo TipoDePessoa na tabela Pessoas.

Não sei até que ponto faz sentido ter uma tabela para endereços... Esperas ter várias pessoas com o mesmo endereço?

Já uma tabela para estados parece-me adequada (e possivelmente para cidades).

Referências a outras tabelas são comuns, quando se tenta normalizar um esquema.

Share this post


Link to post
Share on other sites
Carlos Rocha

É que estou pensando em utilizar herança entre das tabelas clientes, fornecedores e funcionários para com a tabela pessoas mas não estou sabendo como fazer isso!

Share this post


Link to post
Share on other sites
Rui Carlos

Para mim só faz sentido ter tabelas diferentes se os diferentes tipos de pessoas não tiverem exactamente os mesmos atributos. Pelo que percebi, no teu caso qualquer pessoa tem os mesmos atributos, pelo basta colocares lá um atributo a dizer o tipo de pessoa.

Share this post


Link to post
Share on other sites
Carlos Rocha

É, normalmente é assim que faço mesmo.

Mas esses cursos tecnólogos da Faculdade que fazemos hoje em dia confundem a mente da gente!

Share this post


Link to post
Share on other sites
Carlos Rocha

No caso da imagem:

imagem2.png

Como ficaria para passar o relacionamento de herança(UML) para um script SQL?

Share this post


Link to post
Share on other sites
Carlos Rocha

Pessoa Física: CPF e CI

Pessoa Juridca: CNPJ e IE

São diferentes entende?

Edited by carcleo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.