Pergunta

Considere que há um monte de tabelas que apontam para "países" ou "moedas" tabelas.

Para tornar os dados mais fáceis de ler eu gostaria campo CHAR make com código de país (por exemplo, US, GB, UA) e código da moeda (USD, AUD) um chaves primárias em cada um desses 2 mesas e todas as outras mesas usarão este CHAR como uma chave foregin.

Banco de Dados é mysql com motor InnoDB.

Será que vai causar problemas de desempenho? É algo que eu deveria evitar?

Foi útil?

Solução

O desempenho não é realmente a questão principal, pelo menos não para mim. A questão é mais sobre substituto vs chaves naturais.

Os códigos de país não são estáticos. Eles podem e devem mudar. Países mudar nomes (por exemplo, Etiópia para a Eritréia). Eles passam a existir (por exemplo, a dissolução da Jugoslávia ou da União Soviética) e eles deixam de existir (por exemplo Ocidental e Alemanha Oriental). Quando isso acontece, as alterações de código ISO padrão.

Mais em Nome mudanças desde 1990: Países, Cidades, e mais

As chaves substitutas tendem a ser melhor, porque quando esses eventos acontecem as chaves não mudam, apenas colunas na tabela de referência fazer.

Por essa razão eu estaria mais inclinado a criar tabelas de países e moedas com uma chave primária int vez.

Dito isto, campos-chave varchar vai usar mais espaço e têm algumas desvantagens de desempenho que provavelmente não será um problema a menos que você está realizando um grande número de consultas.

Para completar, você pode querer referir-se a Feitos por AppDevelopers .

Outras dicas

link James Skidmore é importante ler.

Se você está limitando-se a códigos de país e de moeda (2 e 3 caracteres, respectivamente), você pode muito bem ser capaz de fugir com declarar o caractere colunas (2) e char (3).

Eu acho que não seria um não-não. Se você estiver usando uma codificação de caracteres de 8-bit, você está olhando para as colunas do tamanho de smallint ou MEDIUMINT, respectivamente.

A minha resposta é que não há uma resposta clara. Basta escolher uma abordagem dentro do seu projeto e ser consistente. Ambos têm seus prós e contras.

@cletus faz um bom ponto sobre o uso de chaves geradas, mas quando você correr em uma situação onde os dados é relativamente estática, como códigos de países, introduzindo uma chave gerada por eles parece excessivamente complexa. Apesar política do mundo real, com códigos de países aparecer e desaparecer não é realmente vai ser um grande problema para a maioria dos problemas de negócios (mas se os seus dados diz respeito activamente todos os 190-210 países, seguir este conselho).

Usando chaves substitutas universalmente é uma boa e uma estratégia popular. Mas lembre-se, ele vem em resposta a modelagem de bancos de dados usando chaves naturais para tudo. Ack! Abrir um livro de banco de dados de 15 anos. Usando chaves naturais em todos os lugares definitivamente você fica em situações difíceis, como a compreensão inicial dos domínios de problemas provar que estou errado. Você quer ter consistência em suas práticas de modelagem, mas usando técnicas diferentes para situações claramente diferentes é OK.

Eu suspeito que o desempenho para a maioria dos bancos de dados modernos sobre var (2) chaves estrangeiras será o mesmo (ou melhor) do que campos int. Bancos de dados têm por anos apoiado chaves estrangeiras textuais.

Tendo em conta que não temos outras informações sobre o projeto, se a preferência é usar os códigos de país como chaves estrangeiras, e você tem a opção de fazê-lo, eu diria que é OK. Vai ser mais fácil trabalhar com os dados. É um pouco contra as práticas atuais, mas-- neste case-- ele não está indo para apoiá-lo em algum canto.

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