Ключ природы против ключа auto_increment в качестве первичного ключа
Моя проблема связана с ключом природы и целым числом auto_increment в качестве первичного ключа.
Например, у меня есть таблицы A
а также B
а также A_B_relation
, А и В могут быть некоторым объектом, и A_B_realtion
записать отношение многих ко многим А и В.
И A, и B имеют свои собственные глобальные уникальные идентификаторы, такие как UUID. UUID доступен для пользователя, это означает, что пользователь может запросить A или B по UUID.
Существует два способа создания первичного ключа таблицы.
- используйте целое число auto_increment.
A_B_relation
ссылаться на целое число как FK. - используйте UUID.
A_B_relation
ссылаться на UUID как FK.
Например, пользователь хочет запросить всю информацию B, связанную с A, по UUID A.
Для первого случая поток запросов таков:
First, query A's integer primary key by UUID from `A`.
And then, query all the B's integer primary key from `A_B_relation`.
At last, query all the B's info from `B`.
В последнем случае поток выглядит следующим образом:
Query all the B's UUID from the `A_B_relation` by A's UUID.
Query all the B's info from `B`.
Поэтому я думаю, что последний случай более удобен. Это правильно? в чем недостаток в последнем случае?
1 ответ
По моему мнению, удобство использования любого натурального ключа автоинкрементного ключа зависит от программного решения, которое вы предоставляете. Оба метода имеют свои плюсы и минусы. Поэтому лучшее решение - правильно понять оба типа ключей, проанализировать, какое бизнес-решение вы пытаетесь предложить, и выбрать соответствующий тип первичного ключа.
Естественный ключ - это столбец или набор столбцов, которые мы можем использовать для уникальной идентификации записи в таблице. Эти столбцы содержат реальные данные, которые связаны с остальными столбцами таблицы.
Автоинкрементный ключ, также называемый суррогатным ключом, представляет собой один столбец таблицы, который содержит уникальные числовые значения, которые можно использовать для уникальной идентификации одной строки данных в таблице. Эти значения генерируются во время выполнения, когда запись вставляется в таблицу и не имеет отношения к остальным данным строки.
Основное преимущество использования естественных ключей состоит в том, что оно имеет свое собственное значение и требует меньшего количества объединений с другими таблицами, где, как если бы мы использовали суррогатный ключ, нам потребовалось бы присоединиться к таблице внешнего ключа, чтобы получить результаты, которые мы получили с естественным ключом.
Но, скажем, мы не можем получить все необходимые данные из одной таблицы и должны объединиться с другой таблицей, чтобы получить все необходимые данные. Тогда вместо естественного ключа удобно использовать суррогатный ключ, потому что в большинстве случаев естественные ключи являются строками и имеют больший размер, чем суррогатные ключи, и потребуется больше времени для объединения таблиц с использованием больших значений.
Естественный ключ имеет свое собственное значение. Поэтому, когда дело доходит до поиска записей, выгоднее использовать естественные ключи, чем суррогатные ключи. Но, скажем, со временем логика нашей программы меняется, и мы должны изменить значение естественного ключа. Это будет сложно и вызовет каскадный эффект для всех отношений с внешним ключом. Мы можем преодолеть эту проблему, используя суррогатный ключ. Поскольку суррогатный ключ не связан с остальными значениями строки, изменения логики не будут влиять на суррогатный ключ.
Кроме того, поскольку я вижу удобство и неудобство использования суррогатного ключа или естественного ключа, полностью основанного на решении, которое вы предлагаете.