---
title: "Первичные ключи - что это такое и какие они должны быть"
description: "Привет всем. Этот пост касается скорей проектированю нежели админисрированию БД. А речь пойдет о Пер..."
author: "Olzhas"
published: "2009-05-04T04:07:26+00:00"
modified: "2009-05-04T04:07:26+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/pervichnye-klyuchi-chto-eto-takoe-i-kakie-oni-dolzhny-byt-6706"
markdown_url: "https://yvision.kz/post/pervichnye-klyuchi-chto-eto-takoe-i-kakie-oni-dolzhny-byt-6706/markdown"
site_name: "Yvision.kz"
---

# Первичные ключи - что это такое и какие они должны быть

> Привет всем. Этот пост касается скорей проектированю нежели админисрированию БД. А речь пойдет о Пер...

Привет всем. Этот пост касается скорей проектированю нежели админисрированию БД. А речь пойдет о Перивичных ключах.

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

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

Так же хотел заметить что есть такое понятие как уникальный ключ(УК). Разлие м\у ПК и УК является то что УК может содержать пустые записи (null в занчениях), тем самым создавая псевдо дублирование, однако если эти поля поставить как не пустые (not null), то различие от ПК будет только в названии.

ПК бывают 2 видов естественные и суррогатные.

- Естественные ключи это те поля которые несут информацию реального объетка, например номер удостоверения личности, паспорта, рнн и т.д.

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

Спорить о том какие ключи лучше естественные или суррогатные бессмысленно, так как у каждого есть свои достоинства и недостатки. А если подойти философски то м\у ними нет разницы, так как есстественные ключи тоже генерируются, взять тот же РНН, удост. личности. Да даже имя :), оно присваиватся вам при рождении.

Как определить какой ключ использовать?!Для этого есть несколько критериев отбора

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

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

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

- Разлиные номера и коды обычно всегда являются есстественными.

Тип полей желательные для построения суррогатного ПК

- Char(1)
- Char(2) или SmallInt
- Char(3)
- Char(4) или Integer
- Char(5-7)
- Char(8) или BigInt

Елси же строка у вас переменной длинны то тогда используйте VarChar(), Старайтесь не использовать числа с плавающей точкой.

Почему именно так?! Потомучто чем менше по размеру ПК тем лучше. Если вы у вас намечатся новый справочник прикинте сколько примерно значений он может содержат если в приделах 30 то смело можно брать Char(1) и пронуберовать буквами от A-z, не больше 50000 то smallInt вполне хватит. Integer это самый "Попсовый ключ" для таблиц. BigInt практически вообще не нужен, Ни разу не видел таблицу больше 2 млд. записпей (половина емкости integer). Однако хочу заметить что это все в теории на самом деле у разных БД есть свои ньюансы хранения данных. И разница в 2 байта практически не заметна. Однако если разница в РАЗЫ то стоит призадуматься. По моему мнению сурогатный ключ не должен быть больше 4 байт. Есстественный не болше 16 байт. Если у вас это не так значит что вы не так напроектировали.

---

Source: [https://yvision.kz/post/pervichnye-klyuchi-chto-eto-takoe-i-kakie-oni-dolzhny-byt-6706](https://yvision.kz/post/pervichnye-klyuchi-chto-eto-takoe-i-kakie-oni-dolzhny-byt-6706)