Здесь есть много компромиссов. На самом деле я часто использую строковые ключи, но часто я включаю суррогатные вторичные ключи для объединений (очевидно, было бы наоборот, если бы я использовал MySQL). Однако есть случаи, когда я этого не делаю.
Во-первых, я фанат объявления естественных ключей в качестве первичного ключа, где БД может справиться с этим хорошо (например, PostgreSQL). Это помогает в нормализации и делает проект базы данных более понятным. Суррогатные ключи облегчают присоединение.
Есть две причины, по которым я обычно добавляю суррогатные ключи:
Не всегда понятно, что такое естественный ключ. Иногда они должны быть изменены. Изменение естественного составного ключа, когда он используется для объединений и ссылочной целостности, является сложным и подверженным ошибкам.
Производительность соединения на составных ключах проблематична, и как только вы идете по естественному ключу, вы застреваете там.
Однако в тех случаях, когда естественным ключом является определение, один столбец и текст, я обычно присоединяюсь к строковому ключу. Моя причина для этого состоит в том, что это часто избегает соединений при поиске. Наиболее распространенное использование - это обеспечение правильного дизайна БД вокруг варианта использования типов enum. В большинстве случаев они не требуют дополнительного объединения для обычных запросов. Так что в этом случае строковые ключи в качестве ключей соединения имеют смысл.
Например, в LedgerSMB мы храним категории учетных записей. Они идентифицируются по строковой ссылке, а некоторые другие данные хранятся со строковой ссылкой, которая используется для обеспечения соблюдения правил, касающихся комбинаций категоризаций, которые могут повлиять на учетную запись. Единственная необходимая логика - это сохранение набора категорий, поэтому мы присоединяемся к строковому ключу.
Что касается того, почему по умолчанию будут целочисленные ключи, я не думаю, что это просто вопрос размера индекса. Большой проблемой является управление ключами. Поскольку ключ произвольный, и вы можете иметь дело с миллионами записей, вы должны иметь способ генерировать уникальные строки. Есть случаи, когда для этого люди используют UUID, но существует вероятность ненулевого столкновения UUID, и там, где хранятся миллиарды записей, этот шанс становится достаточно высоким, что можно увидеть, в то время как вероятность столкновения с увеличенными целочисленными типами равна нулю. по определению.