Existem muitas vantagens e desvantagens aqui. Na verdade, eu uso chaves de string com frequência, mas geralmente incluo chaves secundárias substitutas para junções (obviamente seria o contrário se eu estivesse usando o MySQL). Existem casos em que não o faço.
Primeiro, sou fã de declarar chaves naturais como a chave primária em que o banco de dados pode lidar com isso muito bem (PostgreSQL, por exemplo). Isso ajuda na normalização e facilita o design do banco de dados. Chaves substitutas facilitam a união.
Há duas razões pelas quais geralmente adiciono chaves substitutas:
Nem sempre é claro o que é uma chave natural. Às vezes, esses precisam ser alterados. Alterar uma chave composta natural quando é usada para junções e integridade referencial é complicada e propensa a erros.
O desempenho da junção em chaves compostas é problemático e, quando você segue a rota da chave natural, fica preso lá.
Nos casos em que uma chave natural é de definição, coluna única e texto, no entanto, eu geralmente ingresso na chave de cadeia. Minha razão para fazer isso é que isso geralmente evita a junção na pesquisa. O uso mais comum é fornecer design de banco de dados adequado ao caso de uso dos tipos de enumeração. Na maioria dos casos, eles não exigem a junção extra para consultas de rotina. Portanto, onde for esse o caso, chaves de cadeia como chaves de junção fazem todo sentido.
Por exemplo, no LedgerSMB, armazenamos categorizações de conta. Eles são identificados por referência de sequência. E alguns outros dados são armazenados com a referência de sequência usada para impor regras relacionadas às combinações de categorizações que podem afetar uma conta. O único momento em que a lógica é necessária é ao salvar um conjunto de categorizações, então juntamos a chave da string.
Quanto ao motivo pelo qual o padrão seria chaves inteiras, não acho que seja apenas uma questão de tamanho do índice. Um grande problema é o gerenciamento de chaves. Como a chave é arbitrária e você pode estar lidando com milhões de registros, é necessário ter uma maneira de gerar strings exclusivas. Há casos em que as pessoas usam UUIDs para isso, mas há uma chance diferente de zero de colisão de UUID e, onde bilhões de registros são armazenados, essa chance se torna alta o suficiente para que se possa ver enquanto a chance de colisão com tipos inteiros incrementados é zero por definição.