Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

eduardoPires

Modelagem de dados para modelo relacional - Duvidas Trabalho

Recommended Posts

Pessoal, bom dia,

Tenho que entregar um trabalho com alguns requisitos de modelagem de dados e passando os requisitos da modelagem para o modelo relacional.

os 

 

a) Para a instituição financeira é muito importante manter um cadastro de todas as contas que foram criadas na instituição.

b) Para cada conta criada é importante saber se a conta está ativa ou já foi desativada (ou seja, o cliente encerrou a conta). Isso ajudará a filtrar as pesquisas.

c) As contas da instituição podem pertencer às seguintes categorias: corrente, poupança, salário. Há contas que podem ser corrente e poupança ao mesmo tempo. d) Para as contas da categoria corrente, as seguintes informações devem ser armazenadas: nro da conta, saldo atual, data de abertura, data da última movimentação, limite do cheque especial e valor da taxa administrativa.

e) Para as contas da categoria poupança as seguintes informações devem ser armazenadas: nro da conta, saldo atual, data de abertura, data da última movimentação, rendimento do mês atual.

f) Para as contas da categoria salário as seguintes informações devem ser armazenadas: nro da conta, saldo atual, data de abertura, data da última movimentação, limite para saque e limite para transferência.

g) No momento de criação da conta é importante associar uma senha a ela. Essa senha será solicitada antes da execução de qualquer transação. h) Os clientes da instituição devem ser registrados com as seguintes informações: CPF, nome, endereço completo, estado civil, escolaridade, data de nascimento.

i) É importante também saber em qual agência o cliente foi cadastrado.

j) As agências bancárias devem ser previamente cadastras, sendo que cada agência possui um número, um nome fictício e um endereço, sendo que os campos cidade, estado e bairro são campos frequentemente usados para se realizar buscas por agências.

k) Cada agência possui um gerente, que é um funcionário nomeado para tal tarefa. Cada gerente pode gerenciar apenas uma agência. Entretanto, o gerente de uma agência pode mudar e é muito importante armazenar quais foram os gerentes de uma dada agência com informações da sua data de entrada e saída da gerência.

l) Os gerentes são funcionários da empresa que precisam ter armazenados alguns atributos específicos: data de ingresso na carreira de gerente, agência que ele gerencia e se possui curso de formação

m) Para os funcionários da agência é preciso armazenar as seguintes informações: CPF, nome completo, nro da carteira de trabalho, RG, data de nascimento, endereço, sexo, estado civil, cargo na empresa (existem diferentes cargos além do gerente) e salário.

n) Toda conta bancária deve ter no mínimo um cliente associado. No entanto, uma conta pode ser conjunta. Nesse caso, é possível ter dois clientes associados à mesma conta. Um mesmo cliente pode ter diferentes contas bancárias.

o) Cada conta bancária tem um gerente responsável. O gerente da conta bancária é um funcionário, mas não necessariamente é o mesmo gerente da agência na qual a conta foi criada. Um gerente de conta pode gerenciar várias contas ao mesmo tempo.

p) Toda conta bancária está ligada a uma agência bancária, ou seja, a agência na qual ela foi criada, sendo que o número da conta bancária é único por agência.

q) É importante destacar que o gerente de conta e o gerente de agência são papéis distintos, embora um gerente de agência possa ser também um gerente de conta. Para os gerentes de conta é importante saber quais contas ele gerencia.

r) Uma vez que um cliente tenha uma conta bancária ele pode efetuar diferentes movimentações financeiras, conhecidas como transações bancárias. Cada transação bancária está relacionada a uma conta bancária. Além disso, é importante armazenar a data em que a transação foi realizada, o valor da transação e o canal onde foi feito a transação (internet banking, caixa eletrônico ou caixa físico). Toda vez que uma transação é realizada o saldo do cliente deve ser atualizado.

s) Cada transação possui um tipo. Os tipos de transação atualmente disponíveis são: saque, transferência, depósito e pagamento. Em cada uma dessas transações é importante armazenar apenas o valor da transação. Com o objetivo de simplificar o trabalho não vamos armazenar os atributos específicos de cada tipo de transação, embora esse seja um requisito interessante em problemas reais.

t) É importante observar que os funcionários da instituição também podem ter contas bancárias na instituição.

u) Ainda que um cliente encerre uma conta no banco, é importante manter o registro da conta na base de dados, mas com um indicativo de que ela não está ativa.

v) Cada conta bancária está associada um ou mais cartões de crédito. No entanto o cartão de crédito só pertence a uma conta

w) Um cartão de crédito possui um número identificador, uma bandeira (visa, mastercard, etc.), um código de segurança e uma data de vencimento.

x) Toda vez que um cartão de crédito é criado ele encontra-se bloqueado, sendo necessário que o cliente o desbloqueie antes de usá-lo.

y) A qualquer momento um cartão pode ser desabilitado z) Toda vez que uma transação bancária é realizada, é importante saber qual o cartão usado para executar a transação

 

A modelagem disso tudo esta em anexo.

Os codigos para criação do banco ficou da seguinte forma: 

create table pessoa(cpf varchar(14), nome varchar(50), DataNascimento date, Rua varchar(30), numero int, cep varchar(10), bairro varchar(30), cidade varchar(30), UF char(2), EstadoCivil varchar(15), primary key (cpf));

 

create table Cliente(cpf varchar(14), escolaridade varchar(20), primary key (cpf), foreign key (cpf) references pessoa(cpf));

 

create table Funcionario(cpf varchar(14), RG varchar(13), CarteiraDeTrabalho varchar(14), Sexo char(1), cargo varchar(20), primary key (cpf), foreign key (cpf) references pessoa(cpf));

 

create table GerenteAgencia(cpf varchar(14), cursoFormacaoEmGerencia char(1), dataIngresso date, primary key (cpf), foreign key (cpf) references funcionario(cpf));

 

create table GerenteConta(cpf varchar(14), primary key (cpf), foreign key (cpf) references Funcionario(cpf));

 

create table Gerencia(cpf varchar(14), dataInicio date, dataFim date, primary key (cpf), foreign key (cpf) references GerenteAgencia(cpf));

 

create table Agencia(numAgencia int, nome varchar(25), Rua varchar(30), numero int, cep varchar(10), bairro varchar(30), cidade varchar(30), UF char(2), GerenteAgencia varchar(14), primary key (numAgencia), foreign key(GerenteAgencia) references gerencia(cpf));

 

create table Trabalha(cpf varchar(14), numAgencia int, dataInicio date, dataFim date, primary key(cpf,numAgencia), foreign key (cpf) references funcionario(cpf), foreign key (numAgencia) references agencia(numAgencia));

 

create table conta(numConta int, Cliente varchar(14), numAgencia int, GerenteConta varchar(14), Status varchar(12), senha int[5] not null, dataUltimaMovi date, dataAbertura date, saldoAtual real, primary key (numConta, numAgencia), foreign key (cliente) references cliente(cpf), foreign key (GerenteConta) references gerenteconta(cpf), foreign key (numAgencia) references agencia(numAgencia));

 

create table CartaoConta(numCartao int[16], numConta int, numAgencia int, status varchar(12), bandeira varchar(14), dataVenc date, codSeguranca int[3], primary key (numCartao), foreign key (numConta, numAgencia) references conta(numConta, numAgencia));

 

create table transacoes(idTrans int, numCartao int[16], horaTrans time, MeioDaTransacao varchar(10), tipo varchar(14), valor decimal(15,2), dataTrans date, primary key (idTrans), foreign key (numCartao) references cartaoconta(numCartao));

 

create table contapoupanca(numConta int, numAgencia int, RendimentoMesAtual decimal(15,2), primary key (numConta,numAgencia), foreign key (numConta,numAgencia) references conta(numConta,numAgencia));

 

create table contacorrente(numConta int, numAgencia int, limiteCredEspec decimal(15,2), taxaAdm decimal(15,2), primary key (numConta,numAgencia), foreign key (numConta,numAgencia) references conta(numConta,numAgencia));

 

create table contaSalario(numConta int, numAgencia int, limiteTransf decimal(15,2), limSaque decimal(15,2), primary key (numConta,numAgencia), foreign key (numConta,numAgencia) references conta(numConta,numAgencia));
 

Há alguma coisa errada ou que pode ser melhorada pessoal?

Estou desesperado com isso...
imageproxy.php?img=&key=28afbb360db5c1b9imageproxy.php?img=&key=28afbb360db5c1b9

a.JPG

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mr22robot
      select A.CODPROD,A.DESCRICAO,A.DTMOVLOG DATA,A.NUMNOTA,ROUND(A.QT,2)QTDE,A.PUNIT,A.NOMECODOPER OPERACAO,ROUND(A.P_TOTAL,2)P_TOTAL, (SELECT QTEST - PCEST.QTRESERV QTEST FROM PCEST WHERE CODFILIAL = 1 AND CODPROD = A.CODPROD)QTESTOQUE FROM( SELECT PCMOV.CODPROD,PCMOV.DESCRICAO, TRUNC(PCMOV.DTMOV) DTMOV, PCMOV.DTMOVLOG, PCMOV.NUMNOTA, PCMOV.NUMSEQ, PCMOV.NUMSEQPED, PCMOV.NUMTRANSENT, PCMOV.DTCANCEL, DECODE(DTCANCEL,NULL,'','Cancelado') SITUACAO, PCMOV.CODUSUR, PCMOV.NUMTRANSVENDA, PCMOV.NUMCAR, PCMOV.NUMLOTE, PCMOV.CODFISCAL, NVL(PCMOV.CUSTOREAL,0) CUSTOREAL, NVL(PCMOV.CUSTOFIN,0) CUSTOFIN, (CASE WHEN (SUBSTR(PCMOV.CODOPER,1,1) = 'E') THEN NVL(PCMOV.CUSTOFIN,0) ELSE NVL(PCMOV.CUSTOFINEST,0) END) CUSTOFINEST, NVL(PCMOV.CUSTOULTENT,0) CUSTOULTENT, NVL(PCMOV.CUSTOFORNEC,0) CUSTOFORNEC, NVL(PCMOV.CUSTOCONT,0) CUSTOCONT, DECODE(PCMOV.CODOPER, 'E',PCMOV.CODFORNEC, 'EB',PCMOV.CODFORNEC, 'ET',PCMOV.CODFORNEC, 'ER',PCMOV.CODFORNEC, 'ES',PCMOV.CODFORNEC, PCMOV.CODCLI) CODCLI, NVL(PCMOV.CODFUNCLANC,0) AS CODFUNCLANC, DECODE(SUBSTR(PCMOV.CODOPER, 1, 1), 'S',(PCMOV.QT * (-1)), 'R',(PCMOV.QT * (-1)), DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) AS QT, NVL(PCMOV.PUNIT,0) PUNIT, PCMOV.CODOPER, DECODE(PCMOV.CODOPER, 'E', DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Cancelada','Entrada Merc.'), 'EB',DECODE(GREATEST(PCMOV.QT,0),0,'Bonif. Cancelada','Entrada Bonific.'), 'ET',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Transf. Cancelada','Entrada Transf.'), 'EA',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Ajuste Cancelada','Ajuste Estoque'), 'E1',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Avaria Cancelada','Entrada Avaria'), 'EI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'ED',DECODE(GREATEST(PCMOV.QT,0),0,'Devolução Cancelada','Dev. Cliente'), 'EN',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Venda Consig. Cancelada','Dev. Venda Consignada'), 'ER',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'ES',DECODE(GREATEST(PCMOV.QT,0),0,'Sobra Mercadoria Cancelamento','Sobra de Mercadoria'), 'EM',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Mat. Consumo Cancelada','Entrada Materiais de Consumo'), 'EC',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Consig. Cancelada','Entrada Consignação'), 'EO',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Cancelada','Devolução de Comodato'), 'EX',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Avulsa Cancelada','Devolução Avulsa'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Benefic. Cancelada','Entrada de Beneficiamento'), 'S', DECODE(GREATEST(PCMOV.QT,0),0,'NF Cancelada','Saida'), 'SD',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Cancelada','Dev. Fornecedor'), 'SB',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Bonific. Cancelada','Saida Bonific.'), 'ST',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Transf. Cancelada','Saida Transf.'), 'S1',DECODE(GREATEST(PCMOV.QT,0),0,'Avaria Reaprov. Cancelada','Avaria por Reaproveitamento'), 'SS',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Sobra Cancelada','Saída de Sobra'), 'SA',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Ajuste Cancelada','Ajuste Estoque'), 'SI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'SR',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'SC',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Consig. Cancelada','Saída Consignação'), 'SO',DECODE(GREATEST(PCMOV.QT,0),0,'Remessa Comodato Cancelada','Remessa de Comodato'), 'SF',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Fornec. Cancelada','Devolução de Comodato a Fornecedor'), 'RA',DECODE(GREATEST(PCMOV.QT,0),0,'Req. Avulsa Cancelada','Requisição Avulsa'), 'EP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Entrada Produção'), 'SP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Requisição Mat.Prima'), 'SV',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Avaria Cancelada','Saída por Avaria'), 'SM',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Mat. Consumo Cancelada','Saída Materiais de Consumo'), 'SL',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Perda Cancelada','Saída de Perda'), 'EL',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Perda Cancelada','Entrada de Perda'), 'EF',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Comodato Cancelada','Entrada de Comodato'), 'SN',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Benefic. Cancelada','Saída de Beneficiamento'), 'EV',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Dev. Rem. Benefic. Cancelada','Entrada Devolução de Remessa para Beneficiamento'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Benefic. Cancelada','Entrada de Beneficiamento'), 'Desconhecido') NOMECODOPER, (NVL(PCMOV.PUNIT,0)*DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) P_TOTAL, (CASE WHEN PCMOV.CODOPER IN ('SA', 'EA') THEN (SELECT DISTINCT HISTORICO FROM PCLANC WHERE NUMTRANSENT = PCMOV.NUMTRANSENT AND ROWNUM = 1) ELSE ' ' END) MOTIVO FROM PCMOV, PCPRODUT, PCMOVCOMPLE WHERE PCMOV.CODPROD IN(SELECT CODPROD FROM PCPRODUT WHERE CODSEC IN(10020)) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCMOV.NUMTRANSITEM = PCMOVCOMPLE.NUMTRANSITEM(+) AND NVL(PCMOVCOMPLE.MOVEST, 'S') = 'S' AND PCMOV.DTMOV BETWEEN '01-JAN-2020' AND '29-SEP-2021' AND NVL(PCMOV.CODFILIALNF, PCMOV.CODFILIAL) = '1' AND PCMOV.CODOPER <> 'S' AND ((NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'S' AND PCMOV.NUMLOTE IS NOT NULL) OR (NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'N' AND PCMOV.NUMLOTE IS NULL)) AND PCMOV.STATUS IN ('B','AB') AND NOT EXISTS (SELECT DISTINCT (PCNFSAID.NUMTRANSVENDA) FROM PCNFSAID, PCPRODUT WHERE PCNFSAID.NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND PCNFSAID.CODFILIAL = PCMOV.CODFILIAL AND PCMOV.CODOPER = 'S' AND PCNFSAID.CONDVENDA IN (4, 7, 14) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCPRODUT.TIPOMERC = 'CB') AND NOT (FERRAMENTAS.F_BUSCARPARAMETRO_ALFA('DEVOLVESIMPLESREMTV13TOTAL',PCMOV.CODFILIAL,'N') = 'S' AND PCMOV.ROTINACAD LIKE '%1332%' AND NVL(PCMOVCOMPLE.QTRETORNOTV13,0) = 0) AND NOT EXISTS (SELECT NUMNOTA FROM PCNFSAID WHERE NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND SITUACAONFE IN (110,205,301,302,303)) ORDER BY PCMOV.CODOPER, PCMOV.DTMOV, PCMOV.NUMNOTA )A WHERE A.DTCANCEL IS NULL AND A.CODOPER = 'E' ORDER BY CODPROd,DATA Boa tarde. Estou com essa dúvida:
      Preciso em um select trazer os dados com a seguinte condição: 
      Quando  o valor do punit repetir, somente traz o ultimo registro. ou seja a maior data. 
      caso contrário, traz todos os registros. 
      é possíveç, mais não sei como. Tentei usar o ROW_NUMBER(). Mas não encontrei uma forma de usar. 
      Greato
    • Por Kefatif
      Prezados, boa tarde.
       
      Estou com uma dúvida:
       
      Estou precisando trazer dados do banco para uma tela de edição de cadastro, até aí tudo bem consegui fazer para os input através do código abaixo:
       
      <label style="width:16%;margin-left: 2%;">Data de Início<br> <input type="date" value="<?php echo $row["DATA_DISPENSACAO"] ?>" class="form-control" style="width:100%;"> </label>  
      Mas o meu select já traz o controle de peso do banco, eu gostaria que além dele trazer esses pesos que traga o salvo no cadastro de uma pessoa para visualização e edição.
       
      Segue abaixo o código do select como está:
       
      <label style="width:15%">Peso<b style="color:red">*</b><br> <select name="peso" class="form-control" required style="width:100%" value="<?php echo $row["DATA_TESTE"] ?>"> <option value="">Selecione</option> <?php $sqlpeso = "select distinct PESO from TESTE where ID_ESQUEMA = ".$row["ID_ESQUEMA"]; $resultpeso = mysqli_query($con, $sqlpeso); while ($rowpeso= mysqli_fetch_array($resultpeso)){ ?> <option value="<?php echo utf8_encode($rowpeso["PESO"]);?>" ><?php echo utf8_encode($rowpeso["PESO"]); ?></option> <?php } ?> </select> </label>  
      Meu banco é MYSQL.
       
      Agradeço desde já a todos pela ajuda.
       
      Abraço!
    • Por andreygsantos
      Pessoal, normalmente faço modelagem de banco de dados usando o CA ErWin, mas precisei utilizar a ferramenta de modelagem do MySQL Workbench 8.0 Community.
      O problema ocorre quando a ferramenta começa a "enfeitar o pavão" quando se trata de FK. Vou mostrar um exemplo básico:

      Temos aqui 3 tabelas representando condomínio, unidades e vagas. As vagas pertencem ao condomínio, assim como as unidades. As vagas podem pertencer a unidades diferentes no decorrer do tempo porque não são vagas fixas, portanto não posso pendurar vaga na unidade.
      Problema 1: FK recebe o nome da tabela origem automaticamente.
      Até aqui posso renomear o atributo ou alterar as configurações de modelagem.
       

      Atributos renomeados, temos o seguinte modelo representado acima. Agora vamos levar a PK da entidade UNIDADE para ser FK não identificação na entidade VAGA.
       

      E agora temos o Problema 2: a ferramenta não entende que o atributo CondomínioID já existe e cria novamente com o prefixo da entidade origem. Parece um problema besta e fácil de resolver apagando o atributo duplicado e mantendo apenas UnidadeID, mas ao sincronizar com o banco de dados, começam a surgir erros com índices.
      Abaixo mostro como fica a modelagem no ERWin sem qualquer interferência:
       

      Como podem ver, a modelagem fica perfeita. O ErWin entende que o atributo já existe na entidade e leva apenas o atributo que vai diferenciar para fazer o relacionamento.
       
      Vocês devem estar se perguntando por que eu não uso o ErWin então... Mas a versão do ErWin que tenho não suporta MySQL após a versão 5.x e uma licença nova dessa ferramenta vai me custar 1 rim, senão os 2... Teoricamente, o Workbench deveria fazer essa modelagem sem problemas, mas eu não conheço bem e talvez possa ser alguma configuração. Alguém teria uma luz?
      Obrigado.
       
    • Por Kellison Ruan
      Acho que não fui tão claro no título, portanto irei esmiuçar melhor aqui...
       
      É o seguinte, quero saber se há algum jeito de pegar as linhas de uma coluna q está em VARCHAR com informações do tipo "4 PONTOS DE ILUMINAÇÃO", dessa informação pretendo retirar somente o número que em questão é o "4" e colocá-lo em outra coluna INTEGER. Há essa possibilidade? Detalhe, as vezes as informações não está seguindo um padrão de vim somente como "4 PONTOS DE ILUMINAÇÃO" às vezes vêm dados com mais informações númericas que precisa distinguir, por exemplo, a mim só interessa pegar números que vem antecedendo as palavras "PONTOS", "PTOS", "PTS", têm algum jeito de distinguir isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.