Precisa-se de mais uma sugestão DEA / SQL

The Dealer

Power Member
Cometido o erro de não ter realizado um diagrama entidade-associação para a estrutura de uma aplicação web, decidi reformular o que já fiz, e (recomeçar) por um DEA.

Mas cheguei a uma questão que é a seguinte. Ora vejamos, tenhamos uma determinada lista de alunos que têm várias cadeiras de um determinado curso (tabela alunos), onde os mesmos obtêm várias classificações às variadas cadeiras.

Pela lógica, pareceu-me corrector pensar que uma tabela Alunos (com campos nome, numero, email), uma Disciplinas (com ID's das cadeiras, e nome) e Notas (nota 1, nota 2, nota exame, etc), seria o mais lógico, no entanto será realmente apropriado? Não haverá problema em, ao ter uma tabela apenas para as notas, e tendo em conta que haverá várias cadeiras? É que eu vou precisar de adicionar, remover, alterar, "usar" os registos de várias formas, e penso que assim não será a melhor forma, mas por favor, corrijam-me se estiver enganado :)

Como ainda idealizei a solução ideal na minha cabeça, ponderei em juntar a tabela Disciplinas e Notas numa só DisciplinasNotas, com campos ID, nome, n1, n2,n3 (...)

O que acham?
 
Cometido o erro de não ter realizado um diagrama entidade-associação para a estrutura de uma aplicação web, decidi reformular o que já fiz, e (recomeçar) por um DEA.

Mas cheguei a uma questão que é a seguinte. Ora vejamos, tenhamos uma determinada lista de alunos que têm várias cadeiras de um determinado curso (tabela alunos), onde os mesmos obtêm várias classificações às variadas cadeiras.

Pela lógica, pareceu-me corrector pensar que uma tabela Alunos (com campos nome, numero, email), uma Disciplinas (com ID's das cadeiras, e nome) e Notas (nota 1, nota 2, nota exame, etc), seria o mais lógico, no entanto será realmente apropriado? Não haverá problema em, ao ter uma tabela apenas para as notas, e tendo em conta que haverá várias cadeiras? É que eu vou precisar de adicionar, remover, alterar, "usar" os registos de várias formas, e penso que assim não será a melhor forma, mas por favor, corrijam-me se estiver enganado :)

Como ainda idealizei a solução ideal na minha cabeça, ponderei em juntar a tabela Disciplinas e Notas numa só DisciplinasNotas, com campos ID, nome, n1, n2,n3 (...)

O que acham?

O objectivo do diagrama de ERD é precisamente verificares o que vais precisas, como vais normalizar as tabelas, quais os id's que são primary keys, etc.,etc.

Para o caso eu teria uma tabela para os alunos, uma para as disciplinas, um intermédia aluno-disciplina, com id próprio e uma tabela de notas, que se relaciona com o aluno e disciplina através do ID da tabela auxiliar.
 
O objectivo do diagrama de ERD é precisamente verificares o que vais precisas, como vais normalizar as tabelas, quais os id's que são primary keys, etc.,etc.

Para o caso eu teria uma tabela para os alunos, uma para as disciplinas, um intermédia aluno-disciplina, com id próprio e uma tabela de notas, que se relaciona com o aluno e disciplina através do ID da tabela auxiliar.

Mas como um aluno tem 30 cadeiras, e para cada uma delas tem n1,n2,n3,n4 e n5 (campos na tabela notas), não será complicado aceder às notas de um determinado aluno? É que, ou seja, cada aluno tem 5*30 notas...
 
Mas como um aluno tem 30 cadeiras, e para cada uma delas tem n1,n2,n3,n4 e n5 (campos na tabela notas), não será complicado aceder às notas de um determinado aluno? É que, ou seja, cada aluno tem 5*30 notas...

Na boa, o query de pesquisa tem apenas que procurar registos para o id do aluno e da cadeira. Mas mais uma vez, a análise do ERD é precisamente para pensares qual a melhor forma de criares a tua bd. Por exemplo, na faculdade vão-te ensinar a normalizar até ao infinito, a usares primary keys, foreign keys, tabelas de relacionamento entre id's (como a aluno-cadeira que referi no post inicial), mas depois no «desenvolvimento real» as coisas são um pouco diferentes.

Mas aproveita bem este trabalho para pensares na bd como deve ser.

No caso das notas, vamos por valores concretos:

aluno id = 1;
disciplina id = 1;

podes criar uma tabela com id's e designação para diferentes épocas, estilo (1 - n1, .., 5 - n5) e a tabela das notas pode ter a seguinte estrutura:

id
aluno_id
disciplina_id
epoca_id
nota
createdt (para saberes quando foi lançada a nota)
updatedt (para saberes quando foi actualizado)

para o mesmo aluno, naquela disciplina, a tabela será algo assim

1...1...1...nota...data1...data2
1...1...2...nota...data1...data2
1...1...3...nota...data1...data2
1...1...4...nota...data1...data2
1...1...5...nota...data1...data2

Como vez, depois com um query básico acedes rapidamente à formação. Podes ainda ponderar o seguinte:

Nem todos os alunos vão realizar as 5 épocas. O que pesa mais na bd, esta tabela para as notas, ou meter «milhares» de campos numa tabela, para todos os alunos??
 
Porque haveria de ser complicado? Tu que sabes o que precisas, mas nem daria como nota 1, nota2, final, etc, daria sim com 2 tabelas, 1 em que inserias os testes/exames com o seu id e o id da cadeira, além de que podias adicionar até quando se podiam inscrever e a data dos testes. Noutra tabela fica o id da nota, id do teste, id do aluno e a nota que teve.
Como associar? é só ver pela data dos testes e pelas notas que o aluno teve nesses testes e fazer a média.
 
Para o caso eu teria uma tabela para os alunos, uma para as disciplinas, um intermédia aluno-disciplina, com id próprio e uma tabela de notas, que se relaciona com o aluno e disciplina através do ID da tabela auxiliar.
Desculpa-me, mas agora fiquei confuso. Portanto Alunos e Disciplinas relacionam-se com a tabela intermédia AlunoDisciplina, e a notas relaciona-se com esta ultima apenas?

Porque haveria de ser complicado? Tu que sabes o que precisas, mas nem daria como nota 1, nota2, final, etc, daria sim com 2 tabelas, 1 em que inserias os testes/exames com o seu id e o id da cadeira, além de que podias adicionar até quando se podiam inscrever e a data dos testes. Noutra tabela fica o id da nota, id do teste, id do aluno e a nota que teve.
Como associar? é só ver pela data dos testes e pelas notas que o aluno teve nesses testes e fazer a média.

Mas é outro problema que eu tenho. Porque não se sabe quantos momentos de avaliação uma cadeira terá. O que eu tinha feito no que já tinha feito, foi um radio button ao inicio de 0 (só exame) a x, que quando se escolhia a opção desejada mostrava apenas a informação que se pedia..
 
Desculpa-me, mas agora fiquei confuso. Portanto Alunos e Disciplinas relacionam-se com a tabela intermédia AlunoDisciplina, e a notas relaciona-se com esta ultima apenas?



Mas é outro problema que eu tenho. Porque não se sabe quantos momentos de avaliação uma cadeira terá. O que eu tinha feito no que já tinha feito, foi um radio button ao inicio de 0 (só exame) a x, que quando se escolhia a opção desejada mostrava apenas a informação que se pedia..


Agora introduziste novos dados, que é não saberes quantos momentos de avaliação há.

Ora, assim mais vale teres um tabela com os alunos, outra com as disciplinas e outra que grave o id do aluno, o id da disciplina, a data da avaliação e a nota. assim, tens quantas avaliações quiseres por aluno e por disciplina.
 
Agora introduziste novos dados, que é não saberes quantos momentos de avaliação há.

Ora, assim mais vale teres um tabela com os alunos, outra com as disciplinas e outra que grave o id do aluno, o id da disciplina, a data da avaliação e a nota. assim, tens quantas avaliações quiseres por aluno e por disciplina.

Para ser sincero ainda existe a tabela professores (os que alteram, adicionam registos, removem etc).

Mas vamos por partes. Apesar de ser interessante, para este projecto, datas, não é importante. O que me interessa é mesmo os dados dos alunos, nome e id das disciplinas, e as notas. Mais nada :) Até porque o objectivo especifico deste projecto é o envio de notas por email usando PGP, mas isso é conversa para outra altura :)

Portanto, para estas necessidades, sugeres uma tabela Alunos a relacionar-se com a Disciplinas, e a tabela Notas a relacionar-se com qual?
 
Para ser sincero ainda existe a tabela professores (os que alteram, adicionam registos, removem etc).

Mas vamos por partes. Apesar de ser interessante, para este projecto, datas, não é importante. O que me interessa é mesmo os dados dos alunos, nome e id das disciplinas, e as notas. Mais nada :) Até porque o objectivo especifico deste projecto é o envio de notas por email usando PGP, mas isso é conversa para outra altura :)

Portanto, para estas necessidades, sugeres uma tabela Alunos a relacionar-se com a Disciplinas, e a tabela Notas a relacionar-se com qual?

Vamos por as coisas assim:

1. As datas é que te vão distinguir cada momento de avaliação, por isso não podes prescindir delas;

2. Relações:

Tabela NOTAS

ID - Primary Key;
ID Aluno - Relaciona-se com a tabela ALUNO;
ID Disciplina - Relaciona-se com a tabela DISCIPLINA;
ID Professor - Relaciona-se com a tabela PROFESSORES; (Isto caso haja mais do que um professor para cada disciplina, senão removes este campo e associas na tabela DISCIPLINAS)
Data;
Nota.
 
Vamos por as coisas assim:

1. As datas é que te vão distinguir cada momento de avaliação, por isso não podes prescindir delas;

2. Relações:

Tabela NOTAS

ID - Primary Key;
ID Aluno - Relaciona-se com a tabela ALUNO;
ID Disciplina - Relaciona-se com a tabela DISCIPLINA;
ID Professor - Relaciona-se com a tabela PROFESSORES; (Isto caso haja mais do que um professor para cada disciplina, senão removes este campo e associas na tabela DISCIPLINAS)
Data;
Nota.

Então mas se tenho apenas um campo Nota, apenas poderei guardar um valor de uma nota, enquanto que eu gostaria de apresentar uma tabela em que para cada aluno mostraria toda as notas que ele obteve a uma determinada cadeira. Desculpa, mas não consigo visualizar o que me estás a tentar explicar... Agradeço a tua ajuda.
 
Então mas se tenho apenas um campo Nota, apenas poderei guardar um valor de uma nota, enquanto que eu gostaria de apresentar uma tabela em que para cada aluno mostraria toda as notas que ele obteve a uma determinada cadeira. Desculpa, mas não consigo visualizar o que me estás a tentar explicar... Agradeço a tua ajuda.

OK, um exemplo com 3 alunos, 2 disciplinas, 2 professores e momentos de avaliação diferentes.

Tabela

id aluno ... id disciplina ... id professor ........data ... ..nota
1 1 1 1-1-09 14
1 1 1 1-5-09 12
2 1 1 1-1-09 10
2 1 1 1-5-09 12
2 2 2 1-1-09 10

se fizeres um query ao aluno tipo select * from notas where id_aluno = 1 obtens todas as notas do aluno 1

id aluno ... id disciplina ... id professor ........data ... ..nota
1 1 1 1-1-09 14
1 1 1 1-5-09 12

se fizeres um query à disciplina tipo select * from notas where id_disciplina = 1 obtens todas as notas dessa disciplina

id aluno ... id disciplina ... id professor ........data ... ..nota
1 1 1 1-1-09 14
1 1 1 1-5-09 12
2 1 1 1-1-09 10
2 1 1 1-5-09 12

se refinares o query na disciplina tipo select * from notas where id_disciplina = 1 and data = '1-1-09' obtens todas as notas dessa disciplina numa determinada chamada

id aluno ... id disciplina ... id professor ........data ... ..nota
1 1 1 1-1-09 14
2 1 1 1-1-09 10
 
hummm ok :)

Só uma ultima coisa, se eu tiver uma tabela Alunos(numero,nome), e outras DadosAluno, posso colocar em dados aluno um campo numero como chave primária e ao mesmo tempo chave estrangeira em relação à tabela Alunos?

Estas duas tabelas podem ser alteradas pelos professores, portanto na tabela professores teria de existir algo do género FOREIGN KEY (numero) REFERENCES Alunos(numero) assim como FOREIGN KEY (numero) REFERENCES DadosAluno(numero)

No SQL não deu problema, mas não haverá qualquer problema?

por exemplo, query para devolver todos os dados dos alunos:

PHP:
$sql = "select * from alunos,alunosDados
            WHERE alunos.numero = alunosDados.numero
            order by numero ASC";
 
Última edição:
hummm ok :)

Só uma ultima coisa, se eu tiver uma tabela Alunos(numero,nome), e outras DadosAluno, posso colocar em dados aluno um campo numero como chave primária e ao mesmo tempo chave estrangeira em relação à tabela Alunos?

Estas duas tabelas podem ser alteradas pelos professores, portanto na tabela professores teria de existir algo do género FOREIGN KEY (numero) REFERENCES Alunos(numero) assim como FOREIGN KEY (numero) REFERENCES DadosAluno(numero)

No SQL não deu problema, mas não haverá qualquer problema?

por exemplo, query para devolver todos os dados dos alunos:

PHP:
$sql = "select * from alunos,alunosDados
            WHERE alunos.numero = alunosDados.numero
            order by numero ASC";

Não sou adepto das foreign keys. Se não te deu estouro e está a retornar o que queres, então foi bem implementado!
 
Não sou adepto das foreign keys. Se não te deu estouro e está a retornar o que queres, então foi bem implementado!

Aparenta funcionar :)

Outra questão, cuja resposta vai mudar completamente o futuro da minha aplicação :) É o seguinte, como já referi, eu tenho as Disciplinas, e pretendo implementar no futuro na página inicio.php ("a seguir" ao login.php), uma página onde os professores com um menu dinamico escolhem qual a disciplina a qual pretendem aceder as respectivas informações (sendo que o administrador poderá adicionar e/ou remover cadeiras).

Por isso a questão é, é possivel ter essa página "inicio.php" e permanecer sempre mas sempre nela? Por exemplo, carrega-se na disciplina desejada, e esse "menu" desaparece, e aparecem os alunos inscritos e assim sucessivamente com todas (ou quase todas) operações. É que da forma que eu estou a fazer, do inicio.php, parte para todas as disciplinas e respectivas páginas dedicadas: SO.php, SI.php,AM.php, etc.

Sejamos simplistas ao máximo: exemplo, temos "Sistemas Distribuidos" em HTML, e carregamos e desaparece esse HTML e aparece uma tabela em HTML (com php no meio), e permanecer na mesmo página. Portanto o que estou a perguntar é, é possivel fazer uma aplicação Web em PHP, com funções de consultar, adicionar, remover, alterar, entre outras, e estar sempre "na mesma página" ? É que se for, muda completamente o rumo do meu desenvolvimento :)

É que se continuo como estou, vou ter de "inventar" uma maneira de cada vez que o admin adiciona uma disciplina, o menu dinamico terá de linkar a partir do novo item para uma nova página .php, criada, mas não estou a ver como é que uma situação destas é sequer sustentavel...
 
Última edição:
Portanto o que estou a perguntar é, é possivel fazer uma aplicação Web em PHP, com funções de consultar, adicionar, remover, alterar, entre outras, e estar sempre "na mesma página" ? É que se for, muda completamente o rumo do meu desenvolvimento :)

Poder é possível, recorrendo a ajax e a parâmetros de resposta. Estuda bem é se essa é a melhor forma de gerires a tua aplicação e se ao recorreres a parâmetros nas respostas não estás a abrir brechas na segurança da aplicação.

É que se continuo como estou, vou ter de "inventar" uma maneira de cada vez que o admin adiciona uma disciplina, o menu dinamico terá de linkar a partir do novo item para uma nova página .php, criada, mas não estou a ver como é que uma situação destas é sequer sustentavel...

Geras o menu a partir de uma tabela, ou de um xml, ou da leitura da estrutura de directórios, não é nada complicado.
 
Poder é possível, recorrendo a ajax e a parâmetros de resposta. Estuda bem é se essa é a melhor forma de gerires a tua aplicação e se ao recorreres a parâmetros nas respostas não estás a abrir brechas na segurança da aplicação.



Geras o menu a partir de uma tabela, ou de um xml, ou da leitura da estrutura de directórios, não é nada complicado.

Estive a falar com o meu professor, e tem mesmo de ser da seguinte forma:

Ora vejamos, pretende-se que alunos tenham acesso às notas das suas variadas cadeiras, e os professores tenham acesso, inserção (...). Como já referi, eu estou a fazer para o meu próprio curso, cada disciplina tem sua página, "SO.php, SI.php" etc, no entanto pretende-se que quando os professores acedam à sua "página inicial", tenham a possibilidade de inserir uma nova disciplina (de um outro curso por exemplo).

Agora a questão é, como eu estou a fazer, como posso fazer para criar uma nova página PHP ? Ou existe uma solução mais viável? O que recomendam?

Agradeço sinceramente as vossas ajudas.
 
Estive a falar com o meu professor, e tem mesmo de ser da seguinte forma:

Ora vejamos, pretende-se que alunos tenham acesso às notas das suas variadas cadeiras, e os professores tenham acesso, inserção (...). Como já referi, eu estou a fazer para o meu próprio curso, cada disciplina tem sua página, "SO.php, SI.php" etc, no entanto pretende-se que quando os professores acedam à sua "página inicial", tenham a possibilidade de inserir uma nova disciplina (de um outro curso por exemplo).

Agora a questão é, como eu estou a fazer, como posso fazer para criar uma nova página PHP ? Ou existe uma solução mais viável? O que recomendam?

Agradeço sinceramente as vossas ajudas.

Crias um script que gere o teu template e o insira num ficheiro e grave essa ficheiro no servidor com o nome que queres. Deves criar uma tabela com o path das páginas e o nome que lhes atribuíste, mais o status, ba bla, para gerares o teu menu dinamicamente.
 
Crias um script que gere o teu template e o insira num ficheiro e grave essa ficheiro no servidor com o nome que queres. Deves criar uma tabela com o path das páginas e o nome que lhes atribuíste, mais o status, ba bla, para gerares o teu menu dinamicamente.

O meu problema não é gerar o menu dinamico, que assim que o professora insira uma nova disciplina, apareço no menu. O meu problema é por exemplo, ele cria uma disciplina "Inteligencia Artificial", que apareço no menu, e quando se carrega na opção, ele vai para a página IA.php (por exemplo), por isso, como é que ele vai criar a página?

Penso que a solução esteja relacionada com o template que referiste, algo que não percebi..
 
Não percebo muito de php(quase nada), mas tipo esta página em que tu estas "não existe", é gerada dinamicamente a partir da BD da Zwame.
Imagina que essa página que tu queres criar é no fundo uma query, qdo carregas no link p/ a página é algo o género www.omeusite.pt /index.php?id=nome_da_disciplina&blabla..., se usares isto podes reescrever a url p/ omeusite/nomedadisciplina.html(ou php).
Quando o professor adicionar uma disciplina, esta efectivamente a adicionar umas quantas entradas numa tabela.
Simultaneamente o teu menu é gerado a partir dessa, ou mais, tabelas.
cumps
 
Não percebo muito de php(quase nada), mas tipo esta página em que tu estas "não existe", é gerada dinamicamente a partir da BD da Zwame.
Imagina que essa página que tu queres criar é no fundo uma query, qdo carregas no link p/ a página é algo o género www.omeusite.pt /index.php?id=nome_da_disciplina&blabla..., se usares isto podes reescrever a url p/ omeusite/nomedadisciplina.html(ou php).
Quando o professor adicionar uma disciplina, esta efectivamente a adicionar umas quantas entradas numa tabela.
Simultaneamente o teu menu é gerado a partir dessa, ou mais, tabelas.
cumps

Agora percebi perfeitamente o modo das coisas funcionarem :)

Será que alguem me poderia indicar um tutorial ou algo do género onde explicasse concretamente como se fazem páginas dinamicas em php? Procurei na net e não me safei lá mt bem, por isso se alguem souber de algum pdf ou algo que me ajude nesta questão, agradecia imenso.
 
Back
Topo