Não vejo uma resposta que aponte (o que considero) o ponto realmente fundamental - ou seja, que uma chave primária é o que garante que você não obterá duas entradas na tabela para a mesma entidade do mundo real (como modelado no banco de dados). Essa observação ajuda a estabelecer o que são boas e más escolhas para a chave primária.
Por exemplo, em uma tabela de códigos e nomes de estado (EUA), o nome ou o código pode ser a chave primária - eles constituem duas chaves candidatas diferentes, e uma delas (normalmente a mais curta - o código) é escolhida como a chave primária. Na teoria das dependências funcionais (e dependências de junção - 1NF a 5NF - são as chaves candidatas que são cruciais, e não uma chave primária.
Para um contra-exemplo, nomes humanos geralmente são uma escolha ruim para a chave primária. Existem muitas pessoas que atendem pelo nome de "John Smith" ou algum outro nome semelhante; mesmo levando em consideração os nomes do meio (lembre-se: nem todo mundo tem um - por exemplo, eu não), há muito espaço para duplicação. Conseqüentemente, as pessoas não usam nomes como chaves primárias. Eles inventam chaves artificiais, como o número da previdência social (SSN) ou número do funcionário, e as usam para designar o indivíduo.
Uma chave primária ideal é curta, única, memorável e natural. Dessas características, a exclusividade é obrigatória; o resto precisa ser flexível, dadas as restrições dos dados do mundo real.
Quando se trata de determinar a chave primária de uma determinada tabela, portanto, você deve olhar o que essa tabela representa. Qual conjunto ou conjuntos de valores de coluna na tabela identifica exclusivamente cada linha na tabela? Essas são as chaves candidatas. Agora, se cada chave candidata consistir em 4 ou 5 colunas, então você pode decidir que elas são muito desajeitadas para fazer uma boa chave primária (principalmente por serem curtas). Nessas circunstâncias, você pode introduzir uma chave substituta - um número gerado artificialmente. Muitas vezes (mas nem sempre), um número inteiro simples de 32 bits é suficiente para a chave substituta. Em seguida, você designa essa chave substituta como a chave primária.
No entanto, você ainda deve garantir que as outras chaves candidatas (pois a chave substituta também é uma chave candidata, assim como a chave primária escolhida) são mantidas como identificador exclusivo - normalmente colocando uma restrição exclusiva nesses conjuntos de colunas.
Às vezes, as pessoas acham difícil identificar o que torna uma linha única, mas deveria haver algo para fazer isso, porque simplesmente repetir uma informação não a torna mais verdadeira. E se você não tiver cuidado e obtiver duas (ou mais) linhas que pretendem armazenar as mesmas informações e precisar atualizar as informações, existe o perigo (especialmente se você usar cursores) de atualizar apenas uma linha em vez de cada linha, então as linhas estão fora de sincronia e ninguém sabe qual linha contém as informações corretas.
Esta é uma visão bastante radical, em alguns aspectos.
Não tenho nenhum problema particular em usar um GUID quando necessário, mas eles tendem a ser grandes (como em 16-64 bytes) e são usados com muita frequência. Muitas vezes, um valor de 4 bytes perfeitamente bom seria suficiente. Usar um GUID em que um valor de 4 bytes seria suficiente desperdiça espaço em disco e retarda até mesmo o acesso indexado aos dados, pois há menos valores por página de índice, então o índice será mais profundo e mais páginas terão que ser lidas para chegar ao em formação.