Хорошо, я попробую это сделать. Я приведу несколько быстрых предостережений - я не эксперт по базам данных, и мой опыт работы с Hibernate (Java), а не с NHibernate, но здесь все.
Я думаю, что проблема первичных ключей как строк связана с типом данных SQL, который используется для представления их в базе данных. Поскольку первичный ключ используется все время при вставке, запросе и т. Д., Ядру базы данных приходится тратить много времени на сравнение первичных ключей. Если вы используете числа, они просто сохраняются как байты, с которыми компьютеры действительно хорошо справляются. Как только вы начинаете использовать строки, стоимость этих операций (в основном сравнения) значительно возрастает. Даже если ядро базы данных использует действительно аккуратные стратегии для сравнения ключей, всегда будет быстрее сравнивать байты как байты, а не строки.
Однако на современном оборудовании это становится гораздо менее серьезной проблемой, чем раньше, и с индексами эта проблема почти исчезает.
Я не знаю точно, почему это действительно плохо в Hibernate (и NHibernate), но по моему опыту, потому что мое приложение имеет сложный граф объектов, которые часто имеют ссылки на другие постоянные объекты, часто в виде списков или наборов все ссылки хранятся с использованием идентификатора другого объекта, и из-за правил, которые я установил для каскадного сохранения, выборки и т. д., это будет означать, что первичные ключи используются ВСЕ время. Hibernate - что мне очень нравится - имеет тенденцию делать именно то, что ему говорят, и иногда люди (особенно я!) Говорят, что они делают действительно глупые вещи. В результате даже кажущиеся простыми обновления или запросы в конечном итоге генерируют довольно сложный SQL.
Итак, в заключение, строки как первичные ключи являются плохими из-за стоимости простых операций с ними, и использование Hibernate может увеличить это. На практике, однако, современные движки баз данных имеют много аккуратных стратегий, чтобы гарантировать, что снижение производительности не так уж плохо. (Postgres - и предположительно другие - по умолчанию создают индексы для первичных ключей)
Для продолжения - заменить ключи? Ну, это зависит от производительности вашего приложения. Если производительность критична, то для большого объема и очень интенсивного приложения это может быть хорошей идеей, в противном случае, вероятно, будет минимальная выгода с недостатком необходимости тратить время на смену всех таблиц. Можно ожидать, что вы получите гораздо лучшие результаты, улучшив стратегии, которые вы используете с NHibernate (то есть выборки стратегий, а также каскадные сохранения и т. Д.).