DATABASE DESIGN - первичный ключ для COUNTRY, CURRENCY int или varchar

  • В таблице для моей страны я использовал код страны как первичный ключ "AU, США, Великобритания, FR "и т.д.

  • Для моей валюты я использовал код валюты в качестве первичного ключа "AUD, GBP, USD" и т.д.

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

Должен ли я изменить первичные ключи на int, чтобы быть в безопасности, а не извиняться? Не могу я просто сохранить его?

Ответ 1

Я бы использовал коды ISO с столбцами char.

Если страна когда-либо разбивается, вы получите новые коды ISO (скажем, SC, WL, EN), но Великобритания по-прежнему будет действительна для исторических данных.

То же самое для валюты. В то время сделка в 2000 году была бы в валюте: французские франки, немецкие марки, Бельгия, банан, но не евро.

Ответ 2

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

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

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

Поскольку эти коды действительно короткие и обычно имеют одинаковую длину, я бы рекомендовал использовать CHAR(3) или CHAR(5) - нет смысла использовать VARCHAR для такой короткой строки, а также VARCHAR как переменную поля длины ведут себя по-разному (а не "лучше" с точки зрения производительности), что поля фиксированной длины, такие как INT или CHAR

Ответ 3

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

С физической точки зрения, в SQL Server ключ INTEGER займет более чем вдвое больше места, чем CHAR (2) или CHAR (3). Это означает, что ваши ссылочные таблицы и индексы становятся больше. Он также делает любые обновления этих значений внешнего ключа намного более дорогостоящими. Я не знаю ваших данных, но вполне возможно, что данные ссылок в этих столбцах внешнего ключа могут обновляться гораздо чаще, чем значения кода страны и кода валюты в родительской таблице. Напротив, коды ISO для валюты и страны почти никогда не меняются, поэтому, вероятно, очень мало беспокоиться. Перейдя на клавиши INTEGER, вы можете очень сильно увеличить стоимость обновления этих значений внешнего ключа.

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

Ответ 4

Я думаю, что ваша система устареет десять раз, прежде чем стандарт ISO о коде страны и валюты сделает.

Поэтому я действительно не вижу никакой пользы для использования 01010101 01010011 или 21843 вместо "США".

Ответ 5

Пока любые внешние ключи, которые ссылаются на эти первичные ключи, объявляются с помощью ON UPDATE CASCADE, кто волнуется, изменились ли эти коды?

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


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

Ответ 6

Я бы использовал INT ids как ключ вместо ISO-кодов и объяснил вам, почему:

Организация, в которой я работала, использует "собственную валюту" (LBP) - например, когда пользователь совершает какую-либо транзакцию, он получает некоторое количество LBP в качестве бонуса. Кроме того, он может обменивать эти LBP на USD, EUR и т.д. И наоборот, оплачивать услуги с LBP и т.д. Кроме того, я не нашел валюту BTC (биткойн) в стандарте ISO.

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

Организация, в которой я работала, не использует INTS в качестве первичного ключа, они используют коды ISO как идентификаторы (плюс эти дополнительные валюты).

Официально LBP является стандартом ISO для ливанского фунта стерлингов, поэтому они не смогут беспрепятственно добавить ливанский фунт в систему.

Если вы определяете свои валюты по коду, и в будущем какая-то новая валюта будет зарегистрирована как стандарт ISO (скажем, LBE или BTC) - тогда эти валюты будут конфликтовать с "вашими" валютами.

Кто-то упоминал здесь, что дополнительный ключ int для валют является дополнительным индексом. Но извините, это проблема для 300 записей (приблизительное количество валют)? Более того, если вы используете INTs в качестве первичного ключа для валют, у него есть дополнительное преимущество: представьте таблицу с 1M транзакциями, которая содержит суммы и валюты, и что более эффективно: INTS или CHARS?

Итак, я бы пошел на INTs.

Ответ 7

Да, переход к целочисленному ключу будет хорошей идеей, пока не станет слишком поздно.

например. что, если Великобритания присоединится к еврозоне?

Ответ 8

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