Estou com um problema com o segundo formulário normal (2NF) e não consegui resolvê-lo usando o Google. Isso está me deixando louco porque sou professora e não quero ensinar coisas erradas aos meus alunos.
Vamos ter uma mesa com 5 campos.
Classificação = {StudentName, SubjectCode, SubjectName, #Exam, Grade}
As dependências são assim:
StudentName, SubjectCode, #Exam -> Grade
SubjectCode -> SubjectName
SubjectName -> SubjectCode
Portanto, a chave candidata 1 é {StudentName, SubjectCode, #Exam} e a chave candidata 2 é {StudentName, SubjectName, #Exam} .
Os atributos principais são {StudentName, SubjectCode, SubjectName, #Exam} e os atributos não principais são Grade
De acordo com a definição da segunda forma normal, um atributo não primário não pode depender de uma parte de uma chave candidata. O único atributo não primário (Grade) não depende de uma parte de uma chave candidata, portanto, esta tabela aparece em 2NF.
O problema é que acho que algo está errado (e posso estar errado). Eu acho que os assuntos deveriam ter sua própria mesa.
Classificação = {StudentName, Código da disciplina, # Exame, Nota}
Assuntos = {Código do Assunto, Nome do Assunto}
Mas o 2NF não produz isso. O 3NF trata de dependências entre atributos não primos, portanto também não produz isso. Mas parece-me que este é o resultado certo, porque não tem redundância.
Eu acho que se o atributo não primário fosse definido como "atributo que não é uma chave candidata", o 2NF produziria o resultado desejado. Mas verifiquei isso de novo e de novo e o atributo não primário é definido como "atributo que NÃO PERTENCE a uma chave candidata".
O que estou fazendo de errado?
fonte
Não vou dizer quanto tempo se passou desde que aprendi tudo isso. Mas lembro que tinha um professor que, depois de nos ensinar obedientemente o significado adequado de "dependência funcional" e "atributo não primordial" e todas as outras chavões, nos deu uma série de perguntas simples para perguntar se uma determinada normalidade formulário foi atingido. Vamos ver se consigo me lembrar disso há muito tempo ...
Identificamos a (s) chave (s) candidata (s) e, portanto, fazemos essa pergunta dos demais atributos não principais. Nesse caso, existe apenas um: nota.
Qual é a informação mínima absoluta necessária para identificar exclusivamente a nota? Precisamos conhecer o aluno, o assunto e o exame que está sendo realizado. Tudo bem, essa é uma das chaves candidatas.
EDIT: VVV
Mas a resposta poderia muito bem ter sido o nome do aluno, o assunto e o exame. Isso corresponderia à segunda chave candidata.
Supondo que SubjectCode e SubjectName são chaves candidatas para a entidade Subject, não há razão para ter esses dois campos aqui. Uma referência exclusiva a uma linha na tabela Assuntos é suficiente. Portanto, podemos nos livrar com segurança do campo SubjectName sem sacrificar nenhuma integridade do modelo.
No entanto, em minha resposta original, em meu desejo de mostrar outro nível de normalização, ignorei que SubjectName havia sido usado em uma chave candidata e o considerei apenas outro atributo não primário. Eu acho que era tão óbvio para mim que este era um campo inútil que pensei que seria tão óbvio para todos e, como de qualquer maneira nos livramos do campo, o que importava?
Mas, em vez de remover essa parte da resposta, vou mantê-la em comparação.
END EDIT: ^ ^ ^
Qual é a informação mínima absoluta necessária para identificar exclusivamente o nome do sujeito?
SubjectName depende apenas do SubjectCode - um subconjunto da chave candidata. Portanto, esta tupla não está em 2nf. SubjectCode deve ser a chave primária de uma tabela de assuntos, para que seja o local apropriado para colocar SubjectName. Remova-o desta tupla e agora está em 2nf.
Se fizermos a pergunta de um atributo e a resposta não for toda ou parte da chave candidata, a tupla não estará em 3nf. Mas essa tupla também é trivial em 3nf e além, pois ficamos sem campos para fazer perguntas. ;)
Nota: quando dizemos "normalizar", estamos nos referindo a um processo que é aplicado a uma entidade lógica. Como a tupla fornecida parece ser a definição de uma entidade chamada "nota", podemos normalizá-la. No entanto, em um ponto, eu disse "essa tupla não está em 2nf", o que deveria ser mais apropriadamente ", essa entidade não está em 2nf". Peço desculpas se isso causou confusão.
fonte
É em 2NF.
Não há razão para esperar que os participantes tenham sua própria tabela para decompor a tabela original em 2NF . Você está confundindo alguma noção vaga de "deveria" com o que qualquer forma normal específica realmente lhe dá.
"3NF é sobre dependências entre atributos não primos" não é uma definição adequada de 3NF, portanto "assim também não produz isso" não é uma conclusão sólida. Embora a aplicação de uma definição real mostre que a tabela está no 3NF, não é necessária nenhuma tabela do aluno. Mas, novamente, não há razão para esperar que exista.
Mais uma vez, a "redundância" é inútil, de modo que a expectativa do "porque" e da tabela do aluno não é satisfatória. Diferentes formas normais estão livres e sujeitas a tipos específicos de anomalias e "redundância" associada. Mas outras "redundâncias" não abordadas pela normalização podem permanecer.
Esta tabela não está no BCNF, pois possui FDs que não estão fora das CKs. Decompô-lo pelo BCNF leva a ter a mesa do aluno. O BCNF é a forma normal mais alta para lidar com JDs (dependências de junção) que acompanham os FDs. No entanto, outros JDs podem ser problemáticos (ou seja, não "implícitos pelas CKs") e devem ser removidos por normalização para 5NF.
PS A tabela original também atende ao FD {StudentName, SubjectName, #Exam} -> Grade.
O que isso significa? Não está claro.
Você quer dizer: "Esses são todos os DFs não triviais que são válidos"? Não, porque eles implicam o quarto. "Aqui estão alguns DFs que valem"? Não, isso significa que os FDs no fechamento transitivo se mantêm, mas não diz que outros não se mantêm, mas você conseguiu determinar as CKs. "Os DFs que detêm são exatamente os que estão no fechamento transitivo destes"? Se você quisesse dizer isso, só saberia se tivesse mostrado , ou seja, teria que encontrar o fechamento (normalmente, através de uma cobertura mínima / canônica) e depois mostrar que não há outros DFs; você fez? Independentemente disso, o que você escreveu simplesmente não significa isso. Portanto, espero que você não esteja discutindo profundamente sobre a situação de FD & CK.
fonte
Você está correto, os assuntos exigem sua própria tabela. Se você pegar uma das suas chaves candidatos, seja
subject_code
ousubject_name
se torne uma chave candidata não primário. Você remove o campo de assuntos não primários da tabela de notas.Você tem uma dependência funcional do assunto para a qual possui dois identificadores exclusivos. Isso é demonstrado pela dependência transitiva entre
subject_code
esubject_name
. Isso indica um requisito para criar uma tabela contendo esses dois campos e remover um desses campos de todas as outras tabelas. Essa tabela pode ter colunas dependentes adicionais, embora eu não veja nenhuma neste exemplo. Na terceira forma normal que você selecionou.A nota depende dos outros três campos (chave do candidato) na nova tabela de classificações. Como observado acima, você precisa escolher um dos campos candidatos para a tabela de assuntos. Normalmente, esse seria um valor de código, se disponível, pois eles tendem a ser mais estáveis. O modelo resultante está em 3nf, pois todos os campos não chave são totalmente dependentes dos campos na chave primária.
Uma análise mais aprofundada do problema (requisitos) provavelmente produzirá uma tabela de sessões na qual as marcas são aplicadas. É improvável que o modelo atual cubra um aluno que repete um curso. Isso seria abordado em uma lição posterior.
Os alunos também provavelmente se tornarão uma tabela separada, pois é possível ter vários alunos com o mesmo nome. Isso provavelmente seria resolvido com a adição de uma chave primária sintética (número do aluno?).
fonte
Estou me preparando para excluir isso, pois é considerado incorreto
O Nome do Assunto também é um atributo não primário e depende de parte do Código de Assunto da chave primária (quebra de regra - não deve haver dependência parcial de nenhuma coluna na chave primária).
Isso é proibido na 2ª forma normal e, portanto, deve ser colocado em sua própria mesa, como você suspeitou.
Eu acho que o ponto de desconexão está na identificação de dois conjuntos de chaves candidatas; quando você cria a tabela, deve escolher um conjunto de chaves candidatas para criar a chave primária. As colunas restantes se tornam atributos não primos, ou seja, se você escolheu sua segunda chave candidata, o Código do Assunto se torna um atributo não primo dependente de parte da chave primária (Nome do Assunto) e deve ser colocado em sua própria tabela.
É importante ensinar a 1ª, 2ª e 3ª formas normais para que elas se desenvolvam. O BCNF também é essencialmente uma extensão da 3ª forma normal, portanto é essencial uma forte compreensão dos níveis mais baixos.
Mais longe; um desenvolvedor experiente não considerará os níveis independentes de normalização porque muitas regras se tornam intuitivas.
Eles também saberão quando quebrar as regras de normalização para resolver certos problemas de design e otimização. A normalização deve ser tratada como um guia para um bom design, não uma regra rigorosa, acredito que também seria um bom ponto de ensino.
fonte
{StudentName, SubjectName, #Exam}
". Portanto,StudentName
é um atributo primordial.