Тут є багато компромісів. Насправді я часто використовую рядкові клавіші, але часто я включаю сурогатні вторинні ключі для приєднання (очевидно, це було б навпаки, якби я використовував MySQL). Є випадки, коли я цього не роблю.
По-перше, я прихильник декларування природних ключів як основного ключа, де db може це добре впоратися (наприклад, PostgreSQL). Це допомагає нормалізувати та сприяє більш чіткому дизайну бази даних. Сурогатні ключі полегшують приєднання.
З двох причин я зазвичай додаю сурогатні ключі:
Не завжди зрозуміло, що таке природний ключ. Іноді їх доводиться змінювати. Зміна природного складеного ключа, коли він використовується для з'єднання та референтної цілісності, є складним та схильним до помилок.
Приєднатися до виступу на складених клавішах проблематично, і як тільки ви спуститесь із маршруту природного ключа, ви застряжете там.
У тих випадках, коли природний ключ є остаточним, одинарним стовпцем та текстом, я зазвичай приєднуюся до рядкового ключа. Моя причина для цього полягає в тому, що це часто уникає приєднань під час пошуку. Найбільш поширене використання - це надання належного дизайну db навколо випадку використання типів enum. У більшості випадків вони не потребують додаткового з'єднання для звичайних запитів. Отже, де це так, строкові клавіші як клавіші з'єднання мають ідеальний сенс.
Наприклад, у LedgerSMB ми зберігаємо категоризацію облікових записів. Вони ідентифікуються за допомогою рядкової посилання. Єдиний час, коли потрібна логіка - це збереження набору категоризацій, тому ми приєднуємось до рядкового ключа.
Щодо того, чому за замовчуванням будуть цілі клавіші, я не думаю, що це лише питання розміру індексу. Велике питання - управління ключами. Оскільки ключ довільний і ви можете мати справу з мільйонами записів, ви повинні мати спосіб створення унікальних рядків. Бувають випадки, коли люди використовують для цього UUID, але існує ненульовий шанс зіткнення UUID, і коли зберігаються мільярди записів, цей шанс стає достатньо високим, який можна насправді побачити, тоді як шанс зіткнення з інкремованими цілими типами дорівнює нулю за визначенням.