Номер VS Varchar (2) Первичные ключи

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

STATUS (max 6)
AC --> Active
DE --> Deleted

COUNTRIES (total 30)
UK --> United Kingdom
IT --> Italy
GR --> Greece

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

Основная таблица приложения будет использовать статус и страну (более одного раза, например, страну происхождения, страну назначения), и предполагается, что в год будет добавлено 600000 строк.

Итак, мой вопрос в том, будут ли эти ключи VARCHAR (2) оказывать влияние на производительность при запросе соединения 3 таблиц. Первый будет значительно медленнее второго?

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 'AC'
   AND m.country_cd = 'UK'

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 1
   AND m.country_cd = 2

Разъяснение:

Состояние не является двоичным ( "max 6" рядом с именем таблицы). Значения, вероятно, будут:

* active
* deleted
* draft
* send
* replaced

и нам нужно отобразить декодированные значения для пользователя, поэтому нам нужны имена.

Ответ 1

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

Разница в производительности между соединениями с разными типами будет незначительной, а числовой код будет, если что-либо, медленнее, поскольку есть больше "данных" для хранения (но он настолько мал, что он пренебрежимо мал, снова).

Итак, идите с натуральными кодами. В остальном, SQL в первом примере более ясен; "Великобритания" и "AC" гораздо более значимы, чем 1 и 2.

В СУБД, отличной от Oracle, вы, вероятно, используете CHAR (2) для значений статуса и кода страны. Пользователи Oracle, как правило, используют VARCHAR2 для всего; Я не уверен, есть ли штраф за использование столбца CHAR (2), тем более, что значения столбца являются фиксированной длиной. (В разделе Informix, например, поле VARCHAR (2) - поле длиной до двух символов - будет хранить 3 байта, длину (всегда 2 в вашем случае) и 2 байта данных. Напротив, CHAR (2) будет занимать всего 2 байта.)

Ответ 2

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

Ответ 3

Если "статус" (и всегда будет?) является двоичным активным/удаленным полем, которое вообще беспокоит таблицу. Похоже, что нормализация взята на непрактичную крайность.

Было бы проще, не говоря уже проще, просто использовать поле tinyint (1) и записать активное/удаленное состояние как 1 или 0.

Это полностью исключает одно из ваших объединений, которое должно быть хорошим.

Ответ 4

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