Использование естественных ключей в целях идентификации - хорошая идея, когда естественным ключам действительно можно доверять. См. Ответ Marc_S для некоторых случаев, когда естественным ключам нельзя доверять. Не беспокойтесь об эффективности. Даже что-то длинное, например, VIN (идентификационный номер транспортного средства) не сильно затянет вашу базу данных. Если вы считаете, что это произойдет, проведите несколько тестов, понимая, что эффективность не масштабируется линейно.
Основная причина объявления первичного ключа состоит в том, чтобы предотвратить выпадение таблицы из первой нормальной формы и, таким образом, больше не представлять отношение. Использование автоинкрементного суррогатного ключа может привести к двум строкам с разными полями id, но в остальном идентичные. Это принесет вам некоторые проблемы, связанные с данными, которые не в первой нормальной форме. И пользователи не смогут помочь, потому что они не могут видеть поле id.
Если строки таблицы могут быть определены с помощью некоторой комбинации двух или более внешних ключей, то у вас есть таблица отношений, иногда называемая таблицей связей или таблицей соединений. Обычно лучше объявить составной первичный ключ, состоящий из всех необходимых внешних ключей.
Если приведенные выше варианты приводят к медленному предварительному исполнению, иногда это можно исправить, создав несколько дополнительных индексов. Это зависит от того, что вы делаете с данными.