Inferência de mesa única ou duas tabelas?
-
23-08-2019 - |
Pergunta
Suponha que eu tenha uma tabela com as seguintes colunas (uma lista de palavras):
word: varchar
contributor: integer (FK)
Agora, suponha que eu quisesse ter traduções para cada "palavra". O que seria melhor? Tendo uma segunda tabela?
word: integer (FK)
translation: varchar
contributor: integer (FK)
lang: integer (FK)
Ou tudo na mesma mesa?
word: varchar
translation_for: integer (FK - to the same table)
contributor: integer (FK)
lang: integer (FK)
Suponha que dois cenários, (1) onde eu preciso puxar uma palavra traduzida junto com a palavra original de que foi traduzida, (2) onde eu preciso puxar só a palavra traduzida. Nos dois cenários, eu usaria as palavras "originais" muito mais fortemente (ambas Selecionando e Atualização/inserção).
Então, que abordagem seria melhor para cada cenário, ou em geral? Estou inclinado para a primeira abordagem, desde então meu "padrão" seleciona não terá que ser qualificado pelo Lang coluna. O que você acha?
Obrigado!
Solução
Eu acho que você machucará mais tarde se quiser adicionar um idioma mais tarde, se não normalizar o banco de dados agora. Tenha uma tabela de palavras onde a palavra está no idioma padrão. Tem um ID. Tenha uma tabela de idiomas com um ID (ou seja, espanhol, 2), e uma tabela de tradução que tem a palavra ID, o ID do idioma e, finalmente, a palavra real nesse idioma. Esta é a tabela vinculada.
Use uma visualização para suas consultas, mas para inserções e atualizações, dependendo do seu DBMS, você pode precisar de consultas difíceis.
Isso é apenas assumir que você está tentando fornecer localização e, portanto, provavelmente adicionará mais idiomas posteriormente. Fazer dessa maneira é mais fácil do que ter que modificar seu banco de dados para adicionar colunas sempre que você adicionar um idioma. Se você realmente precisar apenas de uma tradução e duvidar muito de que precisará de outra, apenas adicionar a coluna ficaria bem.
Outras dicas
Como você parece querer que uma "palavra" tenha uma identidade separada de uma "palavra traduzida", acho que a primeira opção atende melhor às suas necessidades.
Normalmente, eu acho que um design mais como:
PK (Key (varchar), Lang (FK)), Word (nvarchar)
Seria mais apropriado - quando você se refere apenas ao texto por sua chave e valor Lang. Mas parece que você está substituindo a tecla pela "palavra original" - para que a torne um pouco diferente.