Okay, ich werde einen Stich haben. Ich werde ein paar schnelle Vorbehalte geben - ich bin kein Experte für Datenbanken und meine Erfahrung ist mit Hibernate (Java) anstatt NHibernate, aber hier geht es.
Ich denke, das Problem der Primärschlüssel als Zeichenfolgen ist mit dem SQL-Datentyp zu tun, der verwendet wird, um sie in der Datenbank zu repräsentieren. Da der Primärschlüssel immer beim Einfügen, Abfragen usw. verwendet wird, muss die Datenbank-Engine viel Zeit mit dem Vergleich von Primärschlüsseln verbringen. Wenn Sie Zahlen verwenden, werden diese einfach als Bytes gespeichert, mit denen Computer wirklich schnell fertig werden. Sobald Sie beginnen, Strings zu verwenden, steigen die Kosten dieser Operationen (hauptsächlich Vergleiche) signifikant. Selbst wenn die Datenbank-Engine wirklich saubere Strategien zum Vergleichen von Schlüsseln verwendet, ist es immer noch schneller, Bytes als Bytes und nicht als Zeichenfolgen zu vergleichen.
Auf moderner Hardware wird dies jedoch viel weniger ein Problem als früher, und mit den Indizes fast das Problem verschwindet.
Ich weiß nicht genau, warum dies wirklich in Hibernate (und NHibernate) ist aber meiner Erfahrung nach, weil meine Anwendung ein komplexes Diagramm von Objekten hat, die häufig Referenzen auf andere persistente Objekte haben, oft als Listen oder Die Referenzen werden alle unter Verwendung der ID des anderen Objekts gespeichert, und aufgrund der Regeln, die ich für kaskadierende Speichervorgänge, Abrufen usw. eingerichtet habe, bedeutet dies, dass die Primärschlüssel ständig verwendet werden. Hibernate - was ich ziemlich mag - tendiert dazu, genau das zu tun, was er gesagt hat, und manchmal sagen Leute (besonders ich!), Dass sie wirklich dumme Sachen machen sollen. Daher führen selbst scheinbar einfache Aktualisierungen oder Abfragen dazu, dass recht komplexes SQL generiert wird.
Also - zusammenfassend - Strings als Primärschlüssel sind schlecht wegen der Kosten von einfachen Operationen auf ihnen und die Verwendung von Hibernate kann dies vergrößern. In der Praxis haben moderne Datenbank-Engines jedoch viele saubere Strategien, um sicherzustellen, dass der Performance-Hit nicht so schlecht ist. (Postgres - und vermutlich auch andere - erstellen standardmäßig Indizes für Primärschlüssel)
Für Ihr Follow-up - sollten Sie Ihre Schlüssel ersetzen? Nun, das hängt von der Leistung Ihrer Anwendung ab. Wenn die Leistung entscheidend ist, dann kann es für eine Anwendung mit hohem Volumen und sehr intensiver Anwendung eine gute Idee sein, sonst wird es wahrscheinlich nur minimalen Nutzen geben, mit dem Nachteil, dass Sie Zeit damit verbringen müssen, all Ihre Tabellen zu ändern. Sie können erwarten, dass Sie viel bessere Ergebnisse erzielen, indem Sie die Strategien verfeinern, die Sie mit NHibernate verwenden (dh Strategien abrufen und Kaskadierungen usw.).