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

Anúncios

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

Olá pessoal.

No post anterior, propus um modelo de mini mundo que será utilizado em nossa aplicação e agora, neste post, vou deixar um passo a passo(sujeito a alterações) que considero que devem ser seguidos para uma maior exatidão na elaboração do seu sistema.

fonte: https://mastigado.wordpress.com

Ata Reunião de Entrevista

Utilizado para documentar o material colhido durante a entrevista e que será aproveitado no início da elaboração do sistema.

01 – Ata de Reunião de Entrevista

Documento de Requisitos

Apesar de eu ter dito sobre a descrição do mini mundo no post anterior, é neste Documento de Requisitos que iremos colocá-lo. Neste documento teremos:

  • Uma breve introdução de nosso sistema;
  • Um descrição do seu propósito;
  • Nossa descrição de mini mundo;
  • Os Requisitos de Usuário(Requisitos Funcionais, Regras de Negócio e os Requisitos Não Funcionais).

02 – Documento de Requisitos

Documentação de Especificação de Requisitos

É neste documento onde definimos quais serão nossos:

  • Subsistemas;
  • Modelos de Caso de Uso(com seus Fluxos Variantes),
  • Modelo Estrutural;
  • Modelo Dinâmico(Diagramas de Estados, Diagramas de Atividades);
  • Dicionário de Projeto.

03 – Documento de Especificação de Requisitos

Estou deixando aqui também um ótimo e curto documento sobre engenharia de requisitos e que deverá ser lido antes de todos os outros.

Introdução a Engenharia de Requisitos

Post anterior

01 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Criando um Mini Mundo

Post posterior

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

fonte: https://mastigado.wordpress.com

01 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Criando um Mini Mundo

Olá pessoal!

Hoje, vou deixar vou começar um post sobre como construir uma aplicação completa desde a análise até o produto final. Isso bem daria um livro, mas imagino que compartilhar o conhecimento é mais forte e faz com que deixemos de nos agarrar a velhos dogmas de que é preciso travar parte do conhecimento para utilizarmos depois como moeda de troca. Pois daqui, materialmente nada se leva, apenas a certeza de que “a mente que se abre a uma nova idéia jamais voltará ao seu tamanho original“.

fonte: https://mastigado.wordpress.com

Sim, no nosso mundo, informação é o maior instrumento que conheço para progredirmos seja para nossa sobrevivência como seres irracionais ou em conhecimento para criar tecnologia, por isso decidi fazer um tutorial um pouco mais aprofundado desta vez, apesar de um pouco resumido, para aqueles que querem saber um pouco mais e que quase sempre, só tem um pouco.

Para dar mais realismo a coisa, vou criar e codificar ao mesmo tempo que desenvolvo este sistema para uma empresa real e que será realmente implantado após o último post. Todo este fonte será utilizado em um sistema de código aberto e sem fins lucrativos, até porque a licença que irei utilizar do Ext JS não é a paga, portanto não permite que o software seja vendido.

Espero poder ajudar os estudantes de análise de sistemas e programadores aprendizes assim como eu, com esta iniciativa. Até porque, apesar desta idéia ser muito bonita, não espere nada tão grandioso de um aprendiz que não tem pretensão de ditar as regras e sim apenas, contribuir com um pouco do que tenho aprendido.

Itinerante

  1. Minimundo;
  2. Documento de Requisitos(Requisitos funcionais, não funcionais, regras de negócio, diagrama de classes e casos de uso);
  3. Modelo Lógico, Normalização de Dados(Formas Normais) e criação de banco em SQL Server e MySQL;
  4. Dicionário de Dados;
  5. Criação da Solution no Visual Studio e camadas de Infra, Domínio, Aplicação;
  6. Execução do script de criação de tabelas e seus relacionamentos, no SQL Server;
  7. Criação do edmx na camada de Infra;
  8. ExtJS 4;
  9. Integrando ExtJS 4.2 MVC com ASP.Net MVC4 no Visual Studio 2010;
  10. Utilizando classes TDO ;
  11. Hospedagem da aplicação no ISS(Internet Information Services).

Mini Mundo

Aprendi que uma descrição de mini mundo deve ser basicamente o mínimo necessário para descrever sua aplicação de forma objetiva, através de levantamento de requisitos como entrevistas, questionários, workshops de requisitos, observação, investigação de documentos, prototipagem, cenários, abordagens baseadas em objetivos e reutilização de requisitos, para então conseguirmos enxergar melhor o cenário que nos espera.

Descrição do Mini Mundo

Numa determinada Empresa, um setor de nome GPA tem a necessidade de um sistema para gerenciar o serviços a ele solicitados.

O sistema deverá permitir o cadastro de modalidades de serviços para que os funcionários possam escolher quais serviços como 2ª via de cartão de plano de saúde, cartão de plano Odontológico, entre outros, desejam atendimento.
 
O sistema GPA deve permitir que cada responsável por determinada área na GPA tenha apenas responsabilidade para atender apenas as modalidades de serviços que lhe competem.

Os funcionários que podem fazer solicitações ao sistema deverão ter cadastro no Active Directory(computador que guarda as informações de login de acesso da rede da Empresa).

Cada solicitação de serviço feita por um funcionário deverá ter no máximo uma reposta de alguma área do GPA em sua caixa de entrada, portanto não será possível responder uma solicitação já feita e sim apenas, abrir uma nova solicitação.

Após uma entrevista com uma pessoa de um setor do GPA, o nosso mini mundo foi feito e o nosso sistema será criado.

Próximo Post

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

fonte: https://mastigado.wordpress.com

%d blogueiros gostam disto: