Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) [Duvida] modelagem de dados


Guido Gabriel

Pergunta

Boa noite pessoal,

Estou modelando um banco para armazenamento de avaliaçoes fisicas de uma academia.

No levantamento dos requisitos, identifiquei que em toda avaliacao fisica de um novo aluno, os seguintes perguntas são feitas:

Nome: __________________________________________ Data de Nascimento ___/___/___Cód.: __________

Sexo: __ Profissão: _____________ Estado civil: ___________ Fone:__________ E-mail: _________________

Em emergência ligar: _____________________________Convênio de saúde: ___________________________

Data Avaliação: ______/______/______ Data Reavaliação ______/______/______

PATOLOGIAS FAMILIARES E PESSOAIS

( )Tabagismo ( )Diabetes ( )Hipertensão ( )Cardiopatia ( )Infarto ( )Ponte de Safena ( )Prolapso de Válvula Mitral ( )Cateterismo ( )Hipercolesterolemia ( )Triglicérides elevado ( )Dispnéia ( )Asma ( )Bronquite ( )Rinite Alérgica ( )Sinusite ( )Enfisema ( )Taquipnéia ( )Marcapasso ( )Epilepsia ( )Hipotireoidismo ( )Hipertireoidismo ( )Labirintite ( )Varizes ( )Desmaios Freqüentes ( )Gastrite ( )Ulcera ( )Prisão de Ventre ( )Osteoartrose ___________________________

( )Osteopenia_____________________________________ ( )Osteoporose__________________________

( )Outros _________________________________________________________________________________

__________________________________________________________________________________________

*********************************************************************************************

Logo na primeira lida, notamos que no banco deverá existir uma tabela aluno na qual constará informações a respeito do cadastro do aluno (marcado de vermelho acima).

O problema é que pensei em construir outra tabela chamada patologia com todos esse campos marcados de azul, to achando que essa tabela vai ter muitos campos com preenchimento SIM/não (tabagismo, diabetes, hipertensao, cardiopatia, infarto, ponte de safena e etc....) e num momento futuro, quando o cliente quiser inserir outro tipo de patologia vou ter sempre que fazer um alter table pra inserir outra patologoa qualquer (por exemplo, ( ) consumidor de alcool ). Não achando muito conveniente fazer uma tabela dessa forma e não to conseguindo visualizar outra forma de modelar este banco. Gostaria de uma ajuda, esclarecimento, dica...

Agradeço desde já.

Vlw...

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Guido Gabriel'

Este é um caso típico de relacionamento muitos para muitos.

Além da tabela aluno, você deverá ter uma tabela de domínio que vou chamar aqui de patologia. Esta tabela será da seguinte forma:

CREATE TABLE patologia (
   idPatologia integer unsigned not null auto_increment, /*que será o identificador de chave primária desta tabela */
   nmPatologia varchar(30) not null, /* que conterá o nome da patologia, ou seja, o descritivo que você usou*/
   primary key(idPatologia),
   unique key (nmPatologia) /* que garantirá que exista apenas um nome para uma ppatologis e permitirá uma busca rápida por este atributo */
);
E uma terceira tabela, que chamarei aqui de rl_patologia_aluno, deverá ser criada. Ela será a tabela de relacionamento que permitirá a ligação da patologia com o aluno. Ela deverá ser criada assim:
CREATE TABLE rl_patologia_aluno (
   idAluno integer unsigned not null, /* supondo que este seja o nome e o tipo que você deu a este atributo na tabela aluno*/
   idPatologia integer unsigned not null,
   CONSTRAINT fk_rlPatologiaAluno_001 FOREIGN KEY (idAluno) REFERENCES aluno(idAluno) ON DELETE NO ACTION, ON UPDATE NOT ACTION,
   CONSTRAINT fk_rlPatologiaAluno_002 FOREIGN KEY (idPatologia) REFERENCES patologia(idpatologia) ON DELETE NO ACTION, ON UPDATE NOT ACTION
);

Nota: As cláusulas CONSTRAINTS só surtirão efeito se você usar o ENGINE InnoDB em suas tabelas.

Para Maiores informações sobre as construções de tabelas e o uso de suas cláusulas, leia o manual do MySQl versão 4.1 (tradução em portugûes) seção 6.5.3. Sintaxe CREATE TABLE

Link para o comentário
Compartilhar em outros sites

  • 0

CREATE TABLE patologia (

idPatologia integer unsigned not null auto_increment, /*que será o identificador de chave primária desta tabela */

tabagismo varchar(30) not null, /* que conterá o nome da patologia, ou seja, o descritivo que você usou*/

diabetes varchar(30) not null,

hipertensao varchar(30) not null,

cardiopatia varchar(30) not null,

infarto varchar(30) not null,

safena varchar(30) not null,

cateterismo varchar(30) not null,

hipercolesterolemia varchar(30) not null,

// etc...

primary key(idPatologia),

unique key (nmPatologia) /* que garantirá que exista apenas um nome para uma ppatologis e permitirá uma busca rápida por este atributo */

);

*******************************************************************

Obrigado Denis pelo seu rápido atendimento,

Já tinha pensado em criar uma tabela de relacionamento rl_patologia_aluno mas estava na dúvida se era o correto, agora que já foi esclarecido...

Outras perguntas:

Então a tabela patologia será dessa forma? Cheia da atributos de várias patologias na qual o cliente vai marcar apenas SIM/não pra informar o sistema que o cara tem aquela determinada patologia ou não? E como vou fazer para inserir outra patologia na tabela quando o cliente solicitar? somente com alter table?

Atenciosamente,

GG

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Guido Gabriel'!

Você disse:

...Outras perguntas:

Então a tabela patologia será dessa forma? Cheia da atributos de várias patologias na qual o cliente vai marcar apenas SIM/não pra informar o sistema que o cara tem aquela determinada patologia ou não? E como vou fazer para inserir outra patologia na tabela quando o cliente solicitar? somente com alter table?...

Creio que você não entendeu o que falei no post anterior.

Quando descrevi a tabela patologia eu já fiz pensando em futuros acréscimos.

O conteúdo da tabela ficaria assim:

IdPatologia    NmPatologia
1    Tabagismo
2    Diabetes
3    Hipertensão
4    Cardiopatia
5    Infarto
6    Ponte de Safena
7    Prolapso de Válvula Mitral
8    Cateterismo
9    Hipercolesterolemia
e outros...
Observando melhor seu primeiro post, em virtude de elementos como ( )Osteoartrose ___________________________ você pode acrescentar, na tabela rl_patologia_aluno, um atrubuto descritivo, do tipo varchar para possibilitar o preenchimento da lacuna. Então a tabela rl_patologia_aluno ficaria assim:
CREATE TABLE rl_patologia_aluno (
   idAluno integer unsigned not null,
   idPatologia integer unsigned not null,
   dsobservacao varchar(255),
   CONSTRAINT fk_rlPatologiaAluno_001 FOREIGN KEY (idAluno) REFERENCES aluno(idAluno) 
      ON DELETE NO ACTION, ON UPDATE NOT ACTION,
   CONSTRAINT fk_rlPatologiaAluno_002 FOREIGN KEY (idPatologia) REFERENCES patologia(idpatologia) 
      ON DELETE NO ACTION, ON UPDATE NOT ACTION
);

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, realmente não tinha entendido por completo a sua explicação na primeira resposta. Com essa segunda explicação ficou mais claro.

Então:

Quando eu vou criar um novo aluno no meu banco, primeiro vou dar um insert na tabela aluno com todos os dados do aluno.

No momento de cadastrar as patologias de um determinado aluno, este relacionamento estará presente na tabela rl_patologia_aluno com o codigo do aluno (que faz referencia à chave primaria da tabela aluno) e o codigo da patologia (que faz referencia a uma patologia na tabela patologia). certo??

Supondo que alimentamos as tabelas assim:

aluno

cod_aluno nome_aluno

1 guido

2 denis

3 joao

4 rafael

patologia

cad_patologia nome_patologia

1 tabagismo

2 diabetes

3 hipertensao

4 cardiopatia

5 infarto

Agora quero dizer que o aluno 1 - guido tem as patologias 2, 4 e 5 (diabetes, cardiopatia e infarto). Como ficaria a tabela rl_patologia_aluno?

Do jeito que voce demonstrou, um aluno so pode ter uma patologia??? ainda não compreendi como posso cadastrar no sistema várias patologias pra um aluno.

Muito grato pelos esclarecimentos...

Atenciosamente,

Guido Gabriel.

Editado por Guido Gabriel
Link para o comentário
Compartilhar em outros sites

  • 0

Oi,'Guido Gabriel'

Você disse:

'Guido Gabriel' date='12/01/2009 - 22:24' post='526038']...

Agora quero dizer que o aluno 1 - guido tem as patologias 2, 4 e 5 (diabetes, cardiopatia e infarto). Como ficaria a tabela rl_patologia_aluno?

Do jeito que voce demonstrou, um aluno so pode ter uma patologia??? ainda não compreendi como posso cadastrar no sistema várias patologias pra um aluno.

A tabela rl_patologia_aluno ficará assim:

IdAluno    idPatologia
1    2
1    4
1    5
A consulta a estes dados, deste aluno, ficará assim:
SELECT cod_aluno, nome_Aluno, nome_patologia 
FROM aluno a
INNER JOIN rl_patologia_aluno rl ON rl.cod_aluno = a.cod_aluno
INNER JOIN patologia p ON p.cad_patologia = rl.cad_patologia 
WHERE a.cod_aluno = 1
Na tabela rl_patologia_aluno esqueci de colocar a chave primária. Segue abaixo a tabela corrigida:
CREATE TABLE rl_patologia_aluno (
   idAluno integer unsigned not null, /* supondo que este seja o nome e o tipo que você deu a este atributo na tabela aluno*/
   idPatologia integer unsigned not null,
   CONSTRAINT fk_rlPatologiaAluno_001 FOREIGN KEY (idAluno) REFERENCES aluno(idAluno) ON DELETE NO ACTION, ON UPDATE NOT ACTION,
   CONSTRAINT fk_rlPatologiaAluno_002 FOREIGN KEY (idPatologia) REFERENCES patologia(idpatologia) ON DELETE NO ACTION, ON UPDATE NOT ACTION.
  primary key (idAluno, idPatologia)
);

Esta chave primária vai assegurar que para cada para ordenado aluno x patologia, só exista um registro.

Mudando de assunto,

Como boa prática eu uso um padrão para a codficação do nome de um atributo (campo).

As primeiras duas letras indicam o que aquele atributo representa em minha tabela. Por exemplo:

id = Identificador (o que será usado como chave primária)

nm = nome de algo ou alguém

ds = descrição de algo

nd = indicador (normalmente booleano para informar sim, não, entrada, saida, credito, debito, etc)

dd = dia

mm = mes

aa = ano

hh = hora

dt = data

rl = relação ou relacionamento

etc.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Acho que voce não entendeu a minha duvida ou eu não entendi sua resposta. rsrs

Se na minha tabela rl_patologia_aluno eu só tenho dois campos (idAluno e idPatologia), como que eu vou dizer que o aluno 1 vai ter as patologias 2, 4, e 5?

CODE

CREATE TABLE rl_patologia_aluno (

idAluno integer unsigned not null, /* supondo que este seja o nome e o tipo que você deu a este atributo na tabela aluno*/

idPatologia integer unsigned not null,

CONSTRAINT fk_rlPatologiaAluno_001 FOREIGN KEY (idAluno) REFERENCES aluno(idAluno) ON DELETE NO ACTION, ON UPDATE NOT ACTION,

CONSTRAINT fk_rlPatologiaAluno_002 FOREIGN KEY (idPatologia) REFERENCES patologia(idpatologia) ON DELETE NO ACTION, ON UPDATE NOT ACTION.

primary key (idAluno, idPatologia)

);

Obrigado pela dica de padrão de nome, vou adotar.

Atenciosamente,

GG

***************************************************************

EDIT:

Nuss, como sou tonto... pra dizer que o aluno 1 vai ter outra patologia vou ter que criar outro registro na mesma tabela!

Obrigado Denis, voce é o cara!!!!

Obg!

Atenciosamente,

Guido Gabriel

Editado por Guido Gabriel
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...