Вопрос

фон

У меня есть эти таблицы

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_code string (PK) |  |country_code string (PK)|
|address string           |  |name string             |
|name  string             |  +------------------------+
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_code string (PK)|
|name string              |
+-------------------------+
.

Airport_code - это IATA (Международная ассоциация воздушного транспорта) Код в аэропорту вы можете увидеть их в ваших багажных бирках, когда вы путешествуете на самолете.

Введите описание изображения здесь

country_code - это ISO 3166-1 A3 Стандартная страна код , вы можете увидеть их на Олимпиаде.

Введите описание изображения здесь

value_code это is0 417 Стандартный 3-Chars код валюты Вы можете увидеть их на международных валютных обменах.

Введите описание изображения здесь

Вопросы

эти естественные PKS достаточно хороши?

использует в мире стандарты уважаемых в мире, которые принимаются целыми отраслями достаточно хорошими для PKS?

<Сильные> Делают ли эти таблицы суррогаты, несмотря ни на что?

Это было полезно?

Решение

Нет, они этого не делают.Эти ключи определенно достаточно хороши!

Они уникальны, не редко собираются измениться, а осмысленно , который - это шаг вверх по суррогатному ключу.Это в значительной степени определение хорошего PK.

Ограничения о PKS, являющиеся неизменным и числовым целым числом, не являются частью реляционная модель (CODD) илилюбой стандарт SQL (ANSI или другой).

Другие советы

Я думаю, что нужно - это очень сильное слово, а в строгом смысле таблицы, вероятно, не нуждаются суррогатных ключей . .

Однако, если бы это была моя база данных, я бы, вероятно, добавлю суррогатные ключи в любом случае. Я не обязательно хочу, чтобы мой дизайн базы данных зависит от группы третьих лиц (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 моих таблиц.

Также важно согласованность в дизайне. Если у вас есть база данных с десятками таблиц, которые все имеют последовательно разработанные суррогатные клавиши, а затем несколько таблиц поиска, которые используют 3-я кодов сторонников в качестве PK, что вводит непоследовательность. Это не совсем плохое, но это требует дополнительного внимания в документации, и такое, что не может быть оправдано. Они Tableup Tables for Goodless Sake, просто используя суррогатный ключ для согласованности совершенно нормально.

<Сильное> Обновление на основе дальнейшего исследования:

ОК, любопытство бит меня, и я решил сделать некоторые исследования по кодам аэропортов IATA для удовольствия, начиная с ссылок, представленных в этом вопросе.

Как оказывается, коды IATA не такие универсальные и авторитетные, поскольку вопрос делает их. Согласно Эта страница :

Большинство стран используют четырех символов icao коды , не коды IATA Официальные авиационные публикации.

Кроме того, коды IATA и коды ICAO отличаются от Коды идентификатора FAA еще один способ определить аэродром.

Моя точка зрения в том, чтобы привлечь их, не начать дебаты о том, какие коды лучше или более универсальные или более авторитетные или более всеобъемлющие, но для того, чтобы показать именно зачем проектирование структуры базы данных вокруг произвольной 3-й партийной идентификатора, не то, что я бы Выберите, чтобы сделать, , если не было конкретной бизнес-причины для этого .

В этом случае я чувствую, что моя база данных будет лучше структурирована, более стабильным и более гибким, подходящим кодам IATA (или любую третью вечеринку, потенциальноменным кодом) в качестве основного кандидата и используйте суррогатный ключ. При этом я могу отказаться от любых потенциальных подводных камней, которые могут обрезать из-за первичного ключа выбора.

, имея суррогатные ключи на полях в порядке, и нет ничего плохого в том, что что-то рассмотреть, может быть сама по себе размер страницы.

Поскольку это реляционная база данных, у вас будет много присоединений, и имея суррогатный ключ численного типа, может облегчить его проще в обращении, то есть размер страницы индекса будет меньше, и, таким образом, будет более быстрее, чтобы искать кормушку Отказ Если это небольшой проект, это не имеет значения, и вы получите без каких-либо проблем, однако, тем больше приложение, тем больше вы захотите уменьшить узкие места.

Наличие BIGINT, INT, SMALTINT, TININT или любой любой любой целочисленный тип данных, может сэкономить вам некоторые проблемы с по дороге.

только мои 2 цента

<Сильное> Обновление:

Малый проект - используется несколькими, возможно, даже несколько десятков людей. Небольшое масштаб, демонстрационный проект, проект для личного пользования, что-то, чтобы добавить в портфолио при представлении ваших навыков без опыта, а тому подобное.

Большой проект - используется тысячами, десятками тысяч, миллионы пользователей ежедневно. То, что вы построили для национальной / международной компании с огромной пользовательской базой.

Обычно то, что произойдет, это выбор немногих записей, которые часто выбираются, и сервер кэширует результаты для быстрого доступа, но каждый день, а затем вам нужно получить доступ к некоторой менее используемой записи, в какой момент сервер придется окунуться на индексную страницу. (В приведенном выше примере с именами аэропорта Люди часто летают отечественные авиалинии, говорят Чичаго -> Лос-Анджелес, но как часто люди летают из Бостона -> Зимбабве)

Если используется VARCAR, это означает, что расстояние не является равномерным, если данные не всегда являются одной и той же длиной (в результате чего значение CHAR более эффективна). Это делает поиск по индексу медленнее, и с сервером уже занят обращение с тысячами и тысячами запросов в секунду, теперь он должен тратить время, идущее через неоднородный индекс, и сделать то же самое снова на присоединениях (что медленнее, чем Регулярные выбирают на неоптимизированной таблице, возьмите DW, в качестве примера, где есть как можно меньше, чтобы ускорить поиск данных). Также, если вы используете UTF, который может связываться с двигателем базы данных (я видел некоторые случаи).

Лично, по моему собственному опыту, правильно организованный индекс может увеличить скорость соединения ~ 70%, и выполнение соединения в целочисленном столбце может ускорить соединение столько же, сколько около ~ 25% (в зависимости от данные). Поскольку основные таблицы начинают расти, и эти таблицы используются на них, вы бы предпочли бы иметь целочисленный тип данных, занимающий столбец, который имеет несколько байтов VS, имеющих поле Varchar / Char, которое будет занимать больше места. Он сводится к сохранению на дисковом пространстве, увеличения производительности и общей структуре реляционной базы данных.

также, как упоминалось Джеймс Снелл:

Первичные ключевые ключи также должны быть неизменными, что-то коды аэропортов IATA определенно нет. Они могут быть изменены на прихоти IATA.

Так что принимая это во внимание, вы бы предпочли бы обновить 1 запись, которая связана с числом, vs, необходимым обновлять, что одна запись плюс все записи в таблице, на которой вы присоединяетесь.

Если вы берете «я использую суррогатные ключи все время», вы можете обойти этот тип заботы. Это может не быть хорошей вещью, потому что важно дать ваши данные некоторые мысли, но это, безусловно, экономит много времени, аренги и усилия. Если кто-то должен был принять принятие в этом правиле, перечисленные примеры, безусловно, квалифицируются, потому что он берет ближайший «акт Конгресса», чтобы сделать изменения.

Специальные запросы базы данных с этими природными ключами, безусловно, полезны. Создание представлений, которые делают то же самое, включая таблицы поиска, также могут работать так же. Современные базы данных делают гораздо лучшую работу с этим типом вещей до такой степени, что он, вероятно, не имеет значения.

Есть некоторые случаи, характерные для США, где стандарты были значительно изменены: почтовый индекс расширился от 5 до 9 цифр, состояние сокращений в соответствии с согласованными 2 буквами и избавиться от периода (помните, как Иллинойс был больным.?) И большая часть мира должна иметь дело с Y2K. Если у вас есть приложение в режиме реального времени с распространением данных по всему миру, содержащему миллиарды записей, каскадные обновления не являются лучшей идеей, но мы не должны все работать в местах, которые сталкиваются с такими проблемами? С таким набором данных вы можете проверить его для себя и придумать более распространенный ответ.

Лицензировано под: CC-BY-SA с атрибуция
scroll top