Как уже отмечали другие, существует два типа ключей для записей: естественные ключи и суррогатные (искусственные) ключи. Итак, два основных вопроса: нужно ли использовать суррогатный ключ, и если да, каким должен быть этот суррогатный ключ?
Что касается первого вопроса: вам только необходимо использовать суррогатный ключ , если у вас нет действительного естественного ключа для использования в качестве основного ключ на столе. Все вменяемые системы баз данных поддерживают предложение «ON UPDATE CASCADE », что означает, что если вы используете естественный ключ, который может измениться, изменение будет распространено на все , которое объявлено для ссылки на него. . Конечно, если ваша система баз данных не поддерживает внешние ключи , тогда лучше всего использовать суррогатный ключ, хотя бы для того, чтобы обойти отсутствие функциональности в системе базы данных (а суррогатные ключи сделают ваш База данных проще для проверки согласованности в свете этого факта). Тем не менее, если вы разрабатываете приложение, которое предъявляет требования к высокому времени безотказной работы и высокой надежности, выберите реализацию базы данных, которая получает правильные внешние ключи, или вы, скорее всего, обнаружите, что ошибки целостности данных будут обнаружены в конце разработки (или даже в обслуживании) ) и вам придется написать утилиты, которые будут проверять ваши данные на согласованность в различных режимах сбоя.
По второму вопросу: если вы используете суррогатный ключ, особенно если вы работаете с недостатком системы базы данных, вы должны всегда обращаться с ним, как если бы он был неизменным и глобально уникальное . ВСЕГДА. Это поможет во многих ситуациях позже: компании могут объединяться (и разделяться), базы данных могут объединяться (и разделяться), и может произойти около миллиона других ситуаций, которые не ожидаются, когда база данных Предназначен для создания проблем, если суррогатные ключи не являются глобально уникальными. Поскольку суррогатные ключи совсем не связаны с данными, которые они хранят (они не имеют никакого отношения к другим полям таблицы, кроме искусственных, которые вы ему наделили), лучше всего так. По этим причинам, когда я должен использовать суррогатный ключ, я использую UUID (который по сути является 128-разрядным целым числом, но не инкрементным). Теперь вам не нужно беспокоиться о перенумерации номеров записей и ссылок, когда происходят непредвиденные события. (Да, это замедляет работу, особенно если ваш сервер работает на 32-битной платформе. Но если вам нужно справиться с большей нагрузкой, лучше распределите нагрузку - не жертвуйте целостностью ради скорости, ever , когда вы работаете с важными данными!)