Então, estou fazendo uma tarefa em que pego uma lista enorme (mais de 30.000) de filmes na Wikipedia que têm várias colunas (como o nome do filme, o gênero, o elenco, o enredo etc.) e carrego no Elasticsearch. No entanto, depois de fazer isso, agora quero fazer com que a tabela esteja em pelo menos 1NF. Não tenho muita experiência em design de banco de dados e a última vez que fiz algo com o Normal Form foi há alguns anos. Então eu estou olhando para esta tabela e pensando, como eu poderia colocar isso no 1NF. É fácil se, por exemplo, houver apenas 1 coluna com vários valores, mas o que você faz quando há várias colunas com vários valores, como visto abaixo.
Nome do filme | Diretor | Elenco | Gênero | Página Wiki | Enredo |
---|---|---|---|---|---|
Chimmie Fadden Out West | Cecil B. DeMile | Victor Moore | Comédia, Ocidental | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie é enviada para o oeste... |
20.000 Léguas Submarinas | Stuart Paton | Lois Alexander, Curtis Benton, Wallace Clarke, Allen Holubar | Ação e aventura | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
O Gato e o Canário | Paulo Leni | Laura La Plante, Forrest Stanley, Creighton Hale | Comédia, Terror, Mistério | https://en.wikipedia.org/wiki/The_Cat_and_the_Canary_(1927_film)| Em um... |
Você teria que fazer algo assim...
Nome do filme | Diretor | Elenco | Gênero | Página Wiki | Enredo |
---|---|---|---|---|---|
Chimmie Fadden Out West | Cecil B. DeMile | Victor Moore | Comédia | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie é enviada para o oeste... |
Chimmie Fadden Out West | Cecil B. DeMile | Victor Moore | Ocidental | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie é enviada para o oeste... |
20.000 Léguas Submarinas | Stuart Paton | Luís Alexandre | Ação | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
20.000 Léguas Submarinas | Stuart Paton | Luís Alexandre | Aventura | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
20.000 Léguas Submarinas | Stuart Paton | Curtis Benton | Ação | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
20.000 Léguas Submarinas | Stuart Paton | Curtis Benton | Aventura | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
20.000 Léguas Submarinas | Stuart Paton | Wallace Clarke | Aventura | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
20.000 Léguas Submarinas | Stuart Paton | Wallace Clarke | Ação | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | Um estranho... |
etc? Certamente estou perdendo algo extremamente simples quando se trata de converter uma tabela com várias células com vários valores em 1NF, mas não tenho certeza do quê.
Obrigado.
Normalização é remover informações de tabelas, que são repetidas muitas vezes e ids como int são menores que qualquer texto.
As tabelas de ponte que você precisa, porque você tem uma relação am:n entre filme e usuários (elenco, diretor, músico...)
Ocupação é na minha opinião um atributo da relação entre filme e usuário
à medida que você desenvolve mais, você pode adicionar mais atributos ou tabelas se encontrar mais informações redundantes
Portanto, é muito fácil normalizar quando há vários campos, alguns com quantidades variadas de pontos de dados em um único campo da mesma linha. Basta seguir esta regra: Qualquer coluna que tenha vários pontos de dados dentro da coluna da mesma linha deve se tornar sua própria tabela. Então, no seu exemplo, isso poderia ser
Cast
eGenre
. É imediatamente aparente que essas duas colunas representam um relacionamento muitos para muitos devido ao fato de que há vários valores armazenados em uma única coluna da mesma linha.Como nbk menciona, você precisará de uma tabela de ligação/ponte para armazenar esse relacionamento muitos para muitos. Portanto, embora sua nova
Cast
tabela possa ter colunas comoCastId
(chave primária),FirstName
, eLastName
, sua tabela de vinculação entreCast
eFilm
seria nomeada comoFilmCast
e teria o campoFilmId
(da suaFilm
tabela) com uma referência de chave estrangeira, e também teria oCastId
com um referência de chave estrangeira para aCast
tabela. Em seguida, cada linha nessaFilmCast
tabela de vinculação representaria uma únicaCast
pessoa específica para um único específicoFilm
.Você repetiria essa mesma ideologia para cada outra coluna em sua
Films
tabela com vários pontos de dados por linha. Depois de ter as tabelas apropriadas para cada coluna normalizada, você não precisará mais armazenar esses dados naFilm
tabela principal e poderá remover essas colunas dela.