Pergunta

Eu estou apenas perguntando, como hipotética exemplo, o que seria a melhor maneira para o layout de uma mesa para o seguinte cenário:

Vamos dizer que eu estou escrevendo um aplicativo de registro de frequência estudante . No início de cada ano, eu quero adicionar todos os alunos (Eu vou fazer isso manualmente - agora, se um estudante ID ser atribuído a cada um aqui Vamos chamada que a tabela Estudantes ?). Agora, a cada dia, eu vou para exibir todos os alunos na tabela Estudantes e permitirá ao usuário escolher atendimento.

Então, como devo colocar minha mesa fora? (Se você não entende o que quero dizer, quero dizer quais dados devem ser inseridos em cada coluna, linha ...) Por exemplo, talvez tenha uma tabela Estudantes com Student IDs e para cada aluno a cada dia criar uma nova linha na mesa de atendimento com Coluna 1: Student ID, Coluna 2: Data, Coluna 3: status (presente / ausente). No entanto, isso não parece ser muito eficiente. O que você acha?

UPDATE: De todas estas primeiras respostas, parece que um aluno está em cada linha na tabela de aluno-atendimento (onde ele / ela é designada como presente / ausente), mas o que se eu foram para incluir mais de um ID de estudante por linha, dizer para todos os alunos ausentes em algum dia? Teria que ser melhor ou pior (provavelmente é ambígua)? Na verdade, eu estou começando a pensar eficiência seria reduzido porque as únicas ações este movimento ajuda ainda pode ser facilmente já realizado. Hmm ...

Foi útil?

Solução

STUDENTS tabela

  • STUDENT_ID, pk
  • FIRST_NAME
  • LAST_NAME

STUDENT_ATTENDANCE tabela

  • STUDENT_ID, pk, fk
  • ABSENT_DATE, pk

Não há necessidade de uma coluna IS_ABSENT - Tendo uma data indica que tanto que o estudante estava ausente, e em que data. Não é provável que seja menos dias de ausência do que participou, portanto, apenas armazenar as datas ausentes.

Fazendo a chave primária a ser composta dos dois garante colunas que você não vai ter duplicatas.

E se eu fosse para incluir mais de um ID de estudante por linha, dizer para todos os alunos ausentes em algum dia? Teria que ser melhor ou pior

Em seguida, são ou armazenar os student_ids adicionais como uma vírgula lista separada em uma única coluna ou colunas adicionais para cada student_id adicional. colunas adicionais para cada student_id nunca iria funcionar - você estaria adicionando uma coluna para cada novo aluno, a cada ano. Concatenar uma lista de student_ids é mais realista, mas vai ser uma dor para puxar os detalhes se você quiser informar sobre um aluno ou grupo de alunos específico. Devido aos limites de caracteres, ele corre o risco de não ser capaz de armazenar todos os student_id que poderia estar ausente com uma única coluna.

Eu recomendo utilizando a tabela de STUDENT_ATTENDANCE sugeri.

Outras dicas

O ponto-chave sobre o design de banco de dados é fornecer um modelo com integridade. Assim, no seu exemplo, você não gostaria de gravar ausências de estudantes para datas que caem em fins de semana, feriados ou dias de baixo-relevo. Então você também precisa de uma tabela CALENDÁRIO. STUDENT_ABSENCE seria um tabela de intersecção entre aluno e calendário. Ou seja, ele teria chaves estrangeiras para tanto um ID na tabela de aluno e um dia no calendário.

Isto pode parecer excesso de engenharia, mas praticamente tudo o que acontece em uma escola envolve programação, assim que um calendário é essencial. Assim como você pode usá-lo tanto quanto possível, para construir o melhor modelo possível.

Além disso, consideram que outros atributos das necessidades de mesa STUDENT_ABSENCE. Em cima da minha cabeça que você pode o que gravar se a ausência foi notificado com antecedência (por exemplo, para férias em família durante o tempo de duração), se a ausência foi aprovado, se a ausência foi devido a doença.

Eu teria um MissedClasses mesa com StudentID como uma chave estrangeira, a data, o curso, e talvez o período, e talvez uma outra coluna para dispensado ou não. Coloque uma entrada, se não comparecer.

O meu raciocínio:. Esperemos que a maioria vai assistir a maioria das classes, assim você só precisa manter o controle dos acidentes

Se você combinar vários valores em uma lista de valores e loja que em uma única célula, a sua mesa não está mais na primeira forma normal é, como originalmente definido por Codd. Você pode estar de acordo com a primeira forma normal tal como redefinido pelo Data armazenando uma tabela dentro de uma tabela. A maioria dos novatos não fazem isso. Eles costumam misturar a lista de valores em uma vírgula separados cadeia de caracteres e armazenar toda a lista como se fosse um único valor atômico.

O que eles encontram mais tarde é que eles já não podem explorar o poder de operadores relacionais, particularmente a juntar-se, a fim de expressar a operações complexas de forma simples. Isso geralmente custa o novato mais de "ineficiência" teria. Mesmo se você colocar uma tabela dentro de uma tabela, você vai achar que está fazendo coisas rotineiras com os dados é muito mais difícil do que tem que ser.

A maioria das boas sugestões de ter obtido envolvem decomposição mesas, a fim de conseguir um esquema normalizado. Isso é geralmente o melhor plano para você seguir, até que você aprenda em algum momento mais tarde, quando a quebrar as regras de normalização e quando a segui-los.

Isto não é escrito para um típico 12 anos de idade. Você não soa como uma típica 12 anos de idade. Então, eu estou tentando dar-lhe uma vantagem sobre os fundamentos de um bom design de banco de dados, em vez de deixá-lo a aprender design de banco ruim na escola, e depois ter de desaprender isso e começar tudo de novo mais tarde.

Eu teria uma tabela aluno com ids estudantis e informações específicas a cada estudante, como nome, série, etc. Então, uma mesa student_attendance com carteira de estudante, data, status (presente / ausente).

Embora isso faz a cobrar um monte de dados, não é verdade que muitos dados e que lhe permite executar vários tipos de relatórios sobre a frequência com muita facilidade.

Você não gostaria de colocar mais que um ID de estudante em uma única linha porque embora você teria menos linhas, você teria apenas o máximo de dados e consultando a tabela / relatando seria estranho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top