Apenas para ser contrário, não, você NÃO precisa sempre ter um AutoInc PK numérico.
Se você analisar seus dados cuidadosamente, geralmente identifica chaves naturais nos dados. Geralmente, esse é o caso quando os dados têm um significado intrínseco para os negócios. Às vezes, as PKs são artefatos de sistemas antigos que os usuários corporativos utilizam como um segundo idioma para descrever os atributos de seu sistema. Vi números de VIN de veículos usados como chave primária de uma tabela "Veículo" em um sistema de gerenciamento de frotas, por exemplo.
Seja como for, se você já possui um identificador exclusivo, use-o. Não crie uma segunda chave primária sem sentido; é um desperdício e pode causar erros.
Às vezes, você pode usar um AutoInc PK para gerar um valor significativo para o cliente, por exemplo, números de política. Definir o valor inicial para algo sensato e aplicar regras de negócios sobre zeros à esquerda, etc. Essa é provavelmente uma abordagem do "melhor dos dois mundos".
Quando você tiver um pequeno número de valores relativamente estáticos, use valores que façam sentido para o usuário do sistema. Por que usar 1,2,3 quando você pode usar L, C, H, onde L, H e C representam Vida, Carro e Lar em um contexto de "Tipo de Política" de seguro ou, voltando ao exemplo do VIN, que tal usar "TO "para a Toyota? Todos os carros da Toyata têm um VIN que inicia o "TO". É uma coisa a menos para os usuários lembrarem, torna menos provável a introdução de erros de programação e do usuário e pode até ser um substituto utilizável para uma descrição completa nos relatórios de gerenciamento, tornando os relatórios mais simples. para escrever e talvez mais rápido para gerar.
Um desenvolvimento adicional disso provavelmente é "uma ponte longe demais" e geralmente não a recomendo, mas estou incluindo-a por completo e você pode achar um bom uso para ela. Ou seja, use a Descrição como chave primária. Para dados que mudam rapidamente, isso é uma abominação. Para dados muito estáticos relatados em Todo o tempo , talvez não. Apenas mencionando, para que fique lá como uma possibilidade.
Eu uso AutoInc PKs, apenas envolvo meu cérebro e procuro melhores alternativas primeiro. A arte do design de banco de dados está criando algo significativo que pode ser consultado rapidamente. Ter muitas junções dificulta isso.
EDIT Outro caso crucial em que você não precisa de uma PK gerada automaticamente é o caso de tabelas que representam a interseção de duas outras tabelas. Para manter a analogia do carro, um carro tem 0..n acessórios, cada acessório pode ser encontrado em muitos carros. Portanto, para representar isso, você cria uma tabela Car_Accessory contendo as PKs de carro e acessório e outras informações relevantes sobre o link Datas etc.
O que você normalmente não precisa é de um AutoInc PK nesta tabela - ele só será acessado através do carro "diga-me quais são os acessórios deste carro" ou no acessório "diga-lhes quais carros têm este acessório"