Tenho uma tabela Produtos, 2 opções:
Deixe o usuário digitar o PK porque alguns usuários podem inserir códigos de barras ou não (nesse caso, o aplicativo deixará o usuário livre para inserir qualquer coisa, por exemplo, suas próprias convenções de código, como Oreo Icecream IC-O). Obviamente, preciso adicionar algumas validações para evitar PK com milhares de caracteres e muito mais.
Use o PK de incremento automático e crie outro campo para um "SecondaryCode", mas para o usuário esta será a chave primária, algumas validações para SecondaryCode aqui também e isso parece estranho usar um SecondaryCode como um PK.
Existe alguma razão muito ruim para não escolher a primeira opção? Teoricamente é bom e mais fácil de gerenciar, mas não me sinto confortável em expor algo importante como uma chave primária. Talvez eu esteja esquecendo de algo óbvio.
CHAVE PRIMÁRIA é uma estrutura (na maioria dos casos, uma expressão que inclui uma única coluna) que identifica exclusivamente uma linha.
Esta é uma estrutura de serviço, não informativa. Ela é usada pelo servidor ao identificar a linha durante a junção, seleção, bloqueio e assim por diante, e pelo subsistema de consistência do servidor durante a verificação de restrição FOREIGN KEY. Na maioria dos casos, o valor desta coluna NÃO deve ser visível para o usuário.
Prefiro sua opção 2 - coluna de autoincremento sintético como CHAVE PRIMÁRIA e uma coluna para código inserido pelo usuário, talvez acompanhada de restrições NOT NULL e/ou UNIQUE.