03 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Modelo Lógico, Normalização de Dados(Formas Normais) e criação de banco em SQL Server e MySQL


Seguindo a sequência dos posts, vou deixar aqui o nosso modelo lógico de forma ilustrada para que possamos visualizar melhor o que aconteceu até agora.

fonte: https://mastigado.wordpress.com

Modelo Lógico

Modelo Lógico -- GPA

Modelo Lógico — GPA

Utilizei o programa Oracle SQL Developer Data Modeler para gerar este modelo. Vocês podem baixar este programa no site da Oracle e utilizar a vontade, pois ele é free e para executá-lo, você também deve ter o Java 7 instalado.
Para criar este modelo utilizei-me das formas normais, abaixo.

Normalização de Dados(Formas Normais)

– Forma Normal diz que Todos os atributos admitem apenas valores atômicos, isso quer dizer que não permite não permite atributos multi valorados em seu grupo. Tive de aplicar um usuário pode ter apenas um Status(Ativo ou Inativo) ou ser de um Tipo de Usuário(Admin ou Usuário Comum);

– Forma Normal diz que Cada atributo não chave é dependente de toda a chave primária. Bem, nesta eu pensei que com a ilustração abaixo conseguisse exemplificar melhor porque no meu exemplo acima encontrei um pouco de dificuldade para falar sobre. No caso abaixo existe uma tabela com 3 chaves(cod_forn, cod_prod e cod_ped) que cria uma dependência de outras tabelas que estão ligadas a ela. No caso abaixo, imagine como seria a situação quando campo cod_prod sofrer uma alteração.

2ª forma normal

2ª forma normal

E assim, na parte mais baixa da figura, a 2ª forma normal é aplicada e os atributos que não são chave, ficam apenas dependentes do que é realmente sua chave primária.

– Forma Normal diz que Cada atributo não chave é dependente não transitivo da chave primária.  Esta diz que para estarmos na 3ª forma normal, antes de tudo deveremos estar na 2ª forma normal e assim depois aplicar a terceira. Para o nosso exemplo, é como se eu tivesse:

  • Uma tabela chamada Municipio_Bairro com os campos codigo_municipio, descricao_municipio e descricao_bairro.

Quando deveriam ser 2 tabelas desta forma:

  • Uma tabela Municipio com os campos codigo_municipio, descricao_municipio e
  • Uma tabela Bairro com os campos codigo_bairro, descricao_bairro e codigo_municipio.

4ª – Forma Normal diz que Uma linha não deve conter dois ou mais fatos de valores múltiplos independentes sobre uma entidade. Bem, pelo que andei lendo, as quartas e quintas formas normais lidam com fatos multivalorados, onde O fato multivalorado pode corresponder a um relacionamento muitos-para-muitos, como funcionários e habilidades, ou a um relacionamento muitos-para-um, como com filhos de um funcionário (assumindo que apenas um dos pais é funcionário). “Muitos-para-muitos” significa que um funcionário possui várias habilidades, e uma habilidade pode pertencer a vários funcionários.

No nosso caso, entendi que um usuário pode prestar serviços de várias modalidades e uma modalidade de serviços pode conter vários usuários que estejam habilitados para ela, por isso temos aí uma relação de N para N. E quando temos uma relação de N para N, devemos colocar uma chamada entidade fraca entre esta relação de entidades.

Repare que dentro da entidade Usuario, eu não tenho nenhum vínculo com a entidade(tabela) Modalidade e vice-versa, por isso, criamos um entidade fraca com o nome de Modalidade_Usuario que carrega as chaves primárias das duas entidades, porém nesta nova entidade, as minhas chaves são do tipo Foreign Key(Chave Estrangeira). Mas isto não quer dizer que uma entidade fraca não possa ter além disso uma chave primária e outros campos não chave.

Criação de banco em SQL Server e MySQL

Aproveitei a oportunidade e criei um script para criação de banco tanto para o SQL Server, quanto para o MySQL. Se você reparar bem, verá que não há muita diferença entre os dois. Consulte os scripts do SQL Server e do MySQL que estão no final do post para entender o que é explicado abaixo.

  • Na declaração de chave primária do SQL Server, eu pude dizer que esta chave vai de 1 em 1(1, 2, 3…7,8,9,10…) e já no do MySQL, eu não me lembro desta opção(nem sei se existe).
  • No MySQL coloquei a cláusula IF NOT EXISTS antes da criação da tabela, porque ele tenta criar a tabela se ela não existir, enquanto roda o script. Já no SQL SERVER, esta opção não funcionou para mim(devo ter feito algo errado na sintaxe).
  • No SQL Server utilizei um padrão que segundo um amigo meu é boa prática o fato de utilizar na identificação da chave primária ou estrangeira um padrão de nomenclatura. Ainda segundo ele, o próprio SQL Server entende este padrão. Para chave primária, utilizamos a identificação do tipo de chave(neste caso, PK), depois o nome da tabela que contém a chave primária e por fim, o nome do campo que será a chave primária, como neste exemplo PK_GPA_Usuario_cd_usuario. Já para a chave estrangeira, o padrão é o identificador do tipo de chave(neste caso, FK), depois o nome da tabela(ou entidade) que contém a chave estrangeira, seguido da tabela que contém a chave primária que a chave estrangeira faz referência e por fim, o nome do campo que será a chave estrangeira, como neste exemplo FK_GPA_Usuario_GPA_Status_cd_status. No MySQL, eu repliquei isso para ficar padrão.
  • Mesmo sendo possível já definir as chaves estrangeiras dentro da criação das tabelas, isto não é uma boa prática porque se você criar este relacionamento entre elas logo em sua criação, pode ser(e é bem provável que isto aconteça), que na hora da execução do seu script, alguma tabela não seja criada por conta de fazer uma referência a uma tabela que ainda não foi criada, pois o seu script começa a executar de cima para baixo. Portanto, para não ter esta dor de cabeça, ainda mais quando se tem um sistema com 100 tabelas, construa os relacionamentos sempre no final de seu script com o comando ALTER TABLE, que já está aí mastigadinho.

Bem, os scripts seguem abaixo.

Se você for criar um banco no SQL Server, poderá utilizar o script abaixo.


use GPA
go

begin tran

CREATE TABLE GPA_Tipo_Usuario (
tp_usuario          integer not null identity(1,1),
ds_tp_usuario       varchar(30) not null,
CONSTRAINT          PK_GPA_Tipo_Usuario_tp_usuario PRIMARY KEY(tp_usuario)
);

CREATE TABLE GPA_Status (
cd_status           integer not null identity(1,1),
ds_status           varchar(30) not null,
CONSTRAINT          PK_GPA_Status_cd_status PRIMARY KEY(cd_status)
);

CREATE TABLE GPA_Modalidade (
cd_modalidade       integer not null identity(1,1),
ds_modalidade       varchar(20) not null,
CONSTRAINT          PK_GPA_Modalidade_cd_modalidade PRIMARY KEY(cd_modalidade)
);

CREATE TABLE GPA_Usuario (
cd_usuario          integer not null identity(1,1),
nome                varchar(60) not null,
login               varchar(20) not null,
senha               varchar(15) not null,
dt_expira           datetime not null,
email               varchar(40),
cd_status           integer not null,
tp_usuario          integer not null,
CONSTRAINT          PK_GPA_Usuario_cd_usuario PRIMARY KEY(cd_usuario)
);

CREATE TABLE GPA_Modalidade_Usuario (
cd_modalidade       integer not null,
cd_usuario          integer not null
);

CREATE TABLE GPA_Solicitacao (
cd_solicitacao      integer not null identity(1,1),
titulo                varchar(100) not null,
ds_solicitacao      varchar(1000) not null,
data                date not null,
cd_usuario          integer not null,
CONSTRAINT          PK_GPA_Solicitacao_cd_solicitacao PRIMARY KEY(cd_solicitacao)
);

CREATE TABLE GPA_Resposta (
cd_resposta         integer not null identity(1,1),
ds_resposta         varchar(1000) not null,
data                date not null,
cd_usuario          integer not null,
cd_solicitacao      integer not null,
CONSTRAINT          PK_GPA_Resposta_cd_resposta PRIMARY KEY(cd_resposta)
);

ALTER TABLE GPA_Modalidade_Usuario ADD CONSTRAINT FK_GPA_Modalidade_Usuario_GPA_Modalidade_cd_modalidade FOREIGN KEY (cd_modalidade) REFERENCES GPA_Modalidade(cd_modalidade);
ALTER TABLE GPA_Modalidade_Usuario ADD CONSTRAINT FK_GPA_Modalidade_Usuario_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);

ALTER TABLE GPA_Solicitacao ADD CONSTRAINT FK_GPA_Solicitacao_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);

ALTER TABLE GPA_Usuario ADD CONSTRAINT FK_GPA_Usuario_GPA_Tipo_Usuario_tp_usuario FOREIGN KEY (tp_usuario) REFERENCES GPA_Tipo_Usuario(tp_usuario);
ALTER TABLE GPA_Usuario ADD CONSTRAINT FK_GPA_Usuario_GPA_Status_cd_status FOREIGN KEY (cd_status) REFERENCES GPA_Status(cd_status);

ALTER TABLE GPA_Resposta ADD CONSTRAINT FK_GPA_Resposta_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);
ALTER TABLE GPA_Resposta ADD CONSTRAINT FK_GPA_Resposta_GPA_Solicitacao_cd_solicitacao FOREIGN KEY (cd_solicitacao) REFERENCES GPA_Solicitacao(cd_solicitacao);

commit

E caso for utilizar no MySQL, poderá utilizar o script abaixo.

CREATE SCHEMA IF NOT EXISTS `gpa`;
USE `gpa`;

CREATE TABLE IF NOT EXISTS  GPA_Tipo_Usuario (
tp_usuario          integer not null AUTO_INCREMENT,
ds_tp_usuario       varchar(30) not null,
PRIMARY KEY(tp_usuario)
);

CREATE TABLE IF NOT EXISTS  GPA_Status (
cd_status           integer not null AUTO_INCREMENT,
ds_status           varchar(30) not null,
PRIMARY KEY(cd_status)
);

CREATE TABLE IF NOT EXISTS  GPA_Modalidade (
cd_modalidade       integer not null AUTO_INCREMENT,
ds_modalidade       varchar(20) not null,
PRIMARY KEY(cd_modalidade)
);

CREATE TABLE IF NOT EXISTS  GPA_Usuario (
cd_usuario          integer not null AUTO_INCREMENT,
nome                varchar(60) not null,
login               varchar(20) not null,
senha               varchar(15) not null,
dt_expira           datetime not null,
email               varchar(40),
cd_status           integer not null,
tp_usuario          integer not null,
PRIMARY KEY(cd_usuario)
);

CREATE TABLE IF NOT EXISTS  GPA_Modalidade_Usuario (
cd_modalidade       integer not null,
cd_usuario          integer not null
);

CREATE TABLE IF NOT EXISTS  GPA_Solicitacao (
cd_solicitacao      integer not null AUTO_INCREMENT,
titulo                varchar(100) not null,
ds_solicitacao      varchar(1000) not null,
data                date not null,
cd_usuario          integer not null,
PRIMARY KEY(cd_solicitacao)
);

CREATE TABLE IF NOT EXISTS  GPA_Resposta (
cd_resposta         integer not null AUTO_INCREMENT,
ds_resposta         varchar(1000) not null,
data                date not null,
cd_usuario          integer not null,
cd_solicitacao      integer not null,
PRIMARY KEY(cd_resposta)
);

ALTER TABLE  GPA_Modalidade_Usuario ADD CONSTRAINT FK_GPA_Modalidade_Usuario_GPA_Modalidade_cd_modalidade FOREIGN KEY (cd_modalidade) REFERENCES GPA_Modalidade(cd_modalidade);
ALTER TABLE  GPA_Modalidade_Usuario ADD CONSTRAINT FK_GPA_Modalidade_Usuario_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);

ALTER TABLE  GPA_Solicitacao ADD CONSTRAINT FK_GPA_Solicitacao_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);

ALTER TABLE  GPA_Usuario ADD CONSTRAINT FK_GPA_Usuario_GPA_Tipo_Usuario_tp_usuario FOREIGN KEY (tp_usuario) REFERENCES GPA_Tipo_Usuario(tp_usuario);
ALTER TABLE  GPA_Usuario ADD CONSTRAINT FK_GPA_Usuario_GPA_Status_cd_status FOREIGN KEY (cd_status) REFERENCES GPA_Status(cd_status);

ALTER TABLE  GPA_Resposta ADD CONSTRAINT FK_GPA_Resposta_GPA_Usuario_cd_usuario FOREIGN KEY (cd_usuario) REFERENCES GPA_Usuario(cd_usuario);
ALTER TABLE  GPA_Resposta ADD CONSTRAINT FK_GPA_Resposta_GPA_Solicitacao_cd_solicitacao FOREIGN KEY (cd_solicitacao) REFERENCES GPA_Solicitacao(cd_solicitacao);

Ah sim! Por que eu utilizei o nome GPA antes dos nomes das tabelas? Why?

Bem, existem empresas para qual você trabalha(ou ainda vai trabalhar) que não tem o hábito de criar um banco de dados para cada sistema e por isso, enfiam todas as tabelas de todos os sistemas em um só banco. Mas por que fazem isso?

Fazem isso porque entendem que não devem existir vários bancos de dados “amontoados” e por isso, entendem também que isso traz maior organização. Mas isso é verdade?

Olha, eu nunca curti isso, pois não é assim que você sai pensando da faculdade, entretanto as más línguas dizem que não faz diferença se você tem vários bds ou um com um monte.

Particularmente vejo muita desvantagem nisso quando quero fazer backup de só um banco ou migrar só determinados dados, pois o processo deixa de ser simples para se tornar “gambiarrento”, se assim posso dizer.

Conclusão: só utilizei este GPA antes do nome das tabelas porque estou fazendo aqui no serviço da mesma forma.

Bem, por hoje é só.

Próximo Post

04 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Dicionário de Dados

Post anterior
02 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Documento de Requisitos

fonte: https://mastigado.wordpress.com

Sobre Mastigado
Sou um daqueles que precisa mudar o mundo.

22 Responses to 03 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Modelo Lógico, Normalização de Dados(Formas Normais) e criação de banco em SQL Server e MySQL

  1. Paulo disse:

    Você vai continuar com o post ? ta bacana

    Curtir

    • mastigado disse:

      Vou continuar com certeza, mas como o material é grande, estou escrevendo muito e já tenho muitos posts no rascunho para serem publicados.
      Espero que na semana que vem eu já possa continuar, até porque, dei uma agarrada enquanto estava desenvolvendo este sistema, pois eu ainda estou aprendendo ExtJS e C#.
      Por isso, minha intenção é compartilhar o que aprendi.

      Curtir

  2. tgnandrade disse:

    Continua as postagens amigos, aguardo ansioso pela continuação!

    Curtir

    • mastigado disse:

      Calma! Não esqueci não, pois estou produzindo muito material em rascunho e eles tem muita sequência, não dá para soltar assim de vez porque é muita coisa para revisar. Vou ver o que consigo fazer.

      Curtir

  3. Ricardo Savir disse:

    Ta massa, parabens

    Curtir

    • mastigado disse:

      Pô valeu. Tô preparando o restante.

      Curtir

  4. Eduardo Strieder disse:

    Cara estou começando agora com C# e ExtJS. Ta muito bacana, parabéns.

    Curtir

    • mastigado disse:

      Pô meu amigo. Vou tentar dar um gás. Eu tive que dar uma paradinha porque tem muitos posts para serem feitos ainda. Valeu.

      Curtir

  5. Heitor disse:

    Parabéns… muito bom… também estou no aguardo!

    Curtir

    • mastigado disse:

      Valeu meu amigo.

      Eu só estou um pouco atarefado e não pude atualizar estes posts, mas em background estou escrevendo muita coisa, só ainda não publiquei.

      Curtir

  6. Emerson Lara disse:

    Muito bom esta show de bola, abraço

    Curtir

    • mastigado disse:

      Pô amigão, valeu.

      Curtir

  7. Will disse:

    Parou estava muito bom!!! continua

    Curtir

    • Mastigado disse:

      Juro que eu tô tentando, pois tá f*** porque tô ocupadasso! Até porque eu tenho que atualizar isso aí.

      Curtir

  8. Humberto disse:

    Cara, vejo pouco material bom como o seu. Parabéns! Espero que continue com o trabalho.

    Curtir

    • Mastigado disse:

      Meu caro, obrigado.

      Curtir

  9. Milton disse:

    Muito didático este material, uma pena que não estejas a colocar outros posts.

    Curtir

    • Mastigado disse:

      Caríssimo, confesso que estou numa pressão tensa. Na verdade eu até tenho no rascunho do blog há mais de um ano, posts prontos para serem publicados, acredito que mais 5 ou 6 posts desta série, mas como eu andei estudando um pouco mais de ExtJS há um tempo atrás, acho que tenho que reformular alguns conteúdos para passar apenas pouca vergonha.
      Eu não esqueci do blog e estou sempre respondendo dúvidas quando posso. Eu até coloquei uma enquete para ver o que o pessoal que frequenta o blog preferiria que eu dissesse, mas tá f*** porque estou estudando muita coisa. Queria colocar além disso, algo sobre paralelismo no Linux, Unreal Engine, MVC com Java, Android, um pouco de Oracle e outra coisas, mas sei que tenho que terminar esta série antes.

      Curtir

  10. Wesley Bretas disse:

    Muito bom os exemplos até aqui. Espero que continue as postagens.
    Abraço!

    Curtir

    • Mastigado disse:

      Meu amigo, eu tenho que continuar. Valeu pela força.

      Curtir

  11. Murillo disse:

    Muito bem preparadas as aulas…

    Continua!

    Caso precise de ajuda com o portal avisa ae IoI

    Curtir

    • Mastigado disse:

      Com certeza meu amigo, preciso de algumas luzes sobre combobox de ExtJS, mas eu vou dar um jeito.

      Curtir

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: