Ci sono molti compromessi qui. In realtà uso spesso le chiavi di stringa, ma spesso includo chiavi secondarie surrogate per i join (ovviamente sarebbe il contrario se usassi MySQL). Ci sono casi in cui non lo faccio comunque.
Innanzitutto sono un fan di dichiarare le chiavi naturali come chiave primaria in cui il db può gestire bene (PostgreSQL per esempio). Questo aiuta con la normalizzazione e rende più chiara la progettazione del database. I tasti surrogati facilitano l'unione.
Esistono due motivi per cui di solito aggiungo chiavi surrogate:
Non è sempre chiaro quale sia una chiave naturale. A volte questi devono essere cambiati. La modifica di una chiave composita naturale quando viene utilizzata per join e integrità referenziale è complicata e soggetta a errori.
Unire le prestazioni su tasti compositi è problematico e una volta che percorri il percorso chiave naturale, rimani bloccato lì.
Nei casi in cui una chiave naturale è di definizione, singola colonna e testo, tuttavia, di solito mi unisco alla chiave di stringa. La mia ragione per farlo è che questo spesso evita di partecipare alla ricerca. L'uso più comune è fornire una corretta progettazione db attorno al caso d'uso di tipi di enum. Nella maggior parte dei casi, questi non richiedono il join aggiuntivo per le query di routine. Quindi, in questo caso, le chiavi di stringa come chiavi di join hanno perfettamente senso.
Ad esempio in LedgerSMB, archiviamo le categorizzazioni degli account. Questi sono identificati dal riferimento di stringa e alcuni altri dati sono memorizzati con il riferimento di stringa che viene utilizzato per applicare le regole relative alle combinazioni di categorizzazioni che possono influenzare un account. L'unica volta in cui è necessaria la logica è quando si salva un set di categorizzazioni, quindi ci uniamo alla chiave di stringa.
Per quanto riguarda il motivo per cui il valore predefinito sarebbe chiavi intere, non credo sia solo una questione di dimensioni dell'indice. Un grosso problema è la gestione delle chiavi. Poiché la chiave è arbitraria e potresti avere a che fare con milioni di record, devi avere un modo per generare stringhe uniche. Ci sono casi in cui le persone usano UUID per questo, ma c'è una possibilità diversa da zero di collisione UUID e dove sono archiviati miliardi di record, questa possibilità diventa abbastanza alta che si potrebbe effettivamente vedere mentre la possibilità di collisione con tipi interi incrementati è zero per definizione.