A chave primária é uma chave exclusiva em sua tabela que você escolhe que melhor identifica exclusivamente um registro na tabela. Todas as tabelas devem ter uma chave primária, pois se você precisar atualizar ou excluir um registro, precisará saber identificá-lo de maneira exclusiva.
Uma chave substituta é uma chave gerada artificialmente. Eles são úteis quando seus registros essencialmente não têm chave natural (como uma
Person
table, já que é possível que duas pessoas nascidas na mesma data tenham o mesmo nome, ou registros em um log, pois é possível que dois eventos aconteçam de forma que carreguem o mesmo timestamp). Na maioria das vezes, você os verá implementados como números inteiros em um campo de incremento automático ou como GUIDs gerados automaticamente para cada registro. Os números de identificação são quase sempre chaves substitutas. Ao contrário das chaves primárias, nem todas as tabelas precisam de chaves substitutas. Se você tem uma tabela que lista os estados da América, você não precisa realmente de um número de identificação para eles. Você pode usar a abreviação de estado como um código de chave primária.
A principal vantagem da chave substituta é que eles são fáceis de garantir como exclusivos. A principal desvantagem é que eles não têm nenhum significado. Não faz sentido que "28" seja Wisconsin, por exemplo, mas quando você vê 'WI' na coluna Estado da sua tabela de endereços, você sabe de que estado está falando sem precisar procurar qual estado é qual em seu estado tabela.