Я не бачу відповіді, яка б вказувала (що я розглядаю) на справді фундаментальний момент - а саме, що первинний ключ - це те, що гарантує, що ви не отримаєте два записи в таблиці для одного і того ж реального світу (як змодельовані в базі даних). Це спостереження допомагає встановити, які хороші, а які погані варіанти первинного ключа.
Наприклад, у таблиці імен і кодів штатів (США) або ім'я, або код можуть бути первинним ключем - вони складають два різні ключі-кандидати, і один із них (зазвичай коротший - код) вибирається як первинний ключ. У теорії функціональних залежностей (та залежності об'єднання - 1NF до 5NF - ключові кандидати мають вирішальне значення, а не первинний ключ.
Як протилежний приклад, людські імена, як правило, роблять неправильний вибір первинного ключа. Є багато людей, які називаються "Джон Сміт" або деякі інші подібні імена; навіть беручи до уваги імена по батькові (пам’ятайте: це не у кожного - наприклад, у мене немає), є багато можливостей для дублювання. Отже, люди не використовують імена як первинні ключі. Вони вигадують штучні ключі, такі як номер соціального страхування (SSN) або номер працівника, і використовують їх для позначення особи.
Ідеальний первинний ключ - це короткий, унікальний, пам’ятний та природний. З цих характеристик унікальність є обов’язковою; решта повинні згинатися, враховуючи обмеження даних реального світу.
Отже, коли справа доходить до визначення первинного ключа даної таблиці, ви повинні подивитися, що ця таблиця представляє. Який набір чи набори значень стовпців у таблиці однозначно ідентифікує кожен рядок у таблиці? Це ключі-кандидати. Тепер, якщо кожен ключ-кандидат складається з 4 або 5 стовпців, тоді ви можете вирішити, що вони занадто незграбні, щоб зробити хороший первинний ключ (в першу чергу через нестачу). За таких обставин ви можете ввести сурогатний ключ - штучно сформоване число. Дуже часто (але не завжди) для сурогатного ключа достатньо простого 32-бітового цілого числа. Потім ви призначаєте цей сурогатний ключ як первинний ключ.
Тим не менш, ви все одно повинні переконатись, що інші ключі-кандидати (для сурогатного ключа є також ключом-кандидатом, а також вибраний первинний ключ) усі зберігаються як унікальний ідентифікатор - зазвичай, шляхом встановлення унікального обмеження на ці набори стовпців.
Іноді людям важко визначити, що робить рядок унікальним, але для цього потрібно щось зробити, тому що просто повторення частини інформації не робить її більш правдивою. І якщо ви не будете обережні і отримаєте два (або більше) рядки, які передбачають зберігати одну і ту ж інформацію, і вам потрібно потім оновити інформацію, існує небезпека (особливо якщо ви використовуєте курсори), що ви оновите лише один рядок замість кожного рядка, тому рядки не синхронізовані, і ніхто не знає, який рядок містить правильну інформацію.
У деяких аспектах це досить тверда точка зору.
У мене немає особливих проблем із використанням GUID, коли вони потрібні, але вони, як правило, великі (як у 16-64 байтах), і їх використовують занадто часто. Дуже часто вистачає цілком гарного 4-байтового значення. Використання GUID, де 4-байтового значення вистачить, витрачає дисковий простір і уповільнює навіть індексований доступ до даних, оскільки на одну сторінку індексу менше значень, тому індекс буде глибшим, і потрібно буде прочитати більше сторінок, щоб дістатися до інформація.