Я думаю, слово « потребность» - очень сильное слово, и в строгом смысле таблицы, вероятно, не нуждаются в суррогатных ключах .
Однако, если бы это была моя база данных, я бы все равно добавил суррогатные ключи. Я не обязательно хочу, чтобы дизайн моей базы данных зависел от группы сторонних производителей (IATA, ISO), независимо от того, насколько стабильны их стандарты. Или я вообще не хочу зависеть от конкретного стандарта (существуют ли другие стандарты кодов валют? Я не знаю). Я бы, вероятно, смоделировал свои таблицы с помощью суррогатных ключей следующим образом:
+-------------------------+ +------------------------+
|Airport | |Country |
|-------------------------| |------------------------|
|airport_id int (PK)| |country_id int (PK) |
|iata_airport_code string | |iso_country_code string |
|icao_airport_code string | +------------------------+
|faa_identifier string |
|address string |
|name string |
+-------------------------+
+-------------------------+
|Currency |
|-------------------------|
|currency_id int (PK) |
|iso_currency_code string |
|name string |
+-------------------------+
Другими словами, если только эти отраслевые стандартные коды не являются важными для моего приложения, я бы не использовал их в качестве PK моих таблиц. Они просто ярлыки. Большинство других моих таблиц, вероятно, в любом случае будут иметь суррогатные ключи, и эта настройка добавит согласованности в мою модель данных. Стоимость «добавления» суррогатных ключей минимальна.
Обновление на основе некоторых комментариев:
Не зная контекста таблиц примеров, невозможно понять, насколько важны такие вещи, как коды аэропортов IATA для приложения, использующего базу данных. Очевидно, что если коды IATA имеют центральное значение и используются повсеместно во всем приложении, то после правильного анализа может оказаться правильным решение использовать коды в качестве PK таблицы.
Однако, если таблица является просто справочной таблицей, которая используется в нескольких углах приложения, относительная важность кодов IATA может не оправдать столь заметное место в инфраструктуре базы данных. Конечно, вам, возможно, придется сделать дополнительное объединение в нескольких запросах здесь и там, но эти усилия могут быть тривиальными по сравнению с усилиями, которые потребуются для проведения исследования, чтобы гарантировать, что вы полностью понимаете последствия создания кодов IATA поле первичного ключа. В некоторых случаях мне не только все равно, но я не хочу заботиться о кодах IATA. Приведенный ниже комментарий @James Snell является прекрасным примером того, что мне, возможно, не захочется беспокоиться о влиянии на PK моих столов.
Также важна последовательность в дизайне. Если у вас есть база данных с десятками таблиц, которые все имеют согласованные суррогатные ключи, а затем несколько таблиц поиска, которые используют сторонние коды в качестве PK, это вносит несоответствие. Это не так уж и плохо, но требует дополнительного внимания в документации и такого, что не может быть оправдано. Ради бога, они справочные таблицы , просто использовать суррогатный ключ для согласованности - это прекрасно.
Обновление на основе дальнейших исследований:
Ладно, меня немного поразило любопытство, и я решил поинтересоваться кодами аэропортов IATA, начав со ссылок, приведенных в вопросе.
Как оказалось, коды IATA не так универсальны и авторитетны, как их ставит вопрос. Согласно этой странице :
Большинство стран используют четырехзначные коды ИКАО , а не коды ИАТА, в своих официальных авиационных публикациях.
Кроме того, коды IATA и коды ICAO отличаются от кодов идентификаторов FAA , которые являются еще одним способом идентификации аэродромов.
Моя точка зрения в том, чтобы поднять их, состоит не в том, чтобы начать дискуссию о том, какие коды лучше или более универсальны, более авторитетны или более полны, а именно, чтобы показать, почему разработка структуры вашей базы данных с произвольным идентификатором третьей стороны - это не то, что я бы выбрал делать , если не было конкретной бизнес-причины для этого .
В этом случае я чувствую, что моя база данных будет лучше структурирована, более стабильной и более гибкой, если исключить коды IATA (или любой другой, потенциально изменяемый код) в качестве кандидата первичного ключа и использовать суррогатный ключ. Поступая так, я могу избежать любых потенциальных ловушек, которые могут возникнуть из-за выбора первичного ключа.