В каких случаях следует использовать синтетический (суррогатный) первичный ключ в базе данных?

«В каких случаях следует использовать синтетический (суррогатный) первичный ключ в базе данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Синтетический (суррогатный) ключ — это технический, не имеющий бизнес-смысла идентификатор (обычно автоинкрементное число или UUID), создаваемый исключительно для уникальной идентификации записи.

Используйте синтетический ключ как основную стратегию, особенно когда:

  • Нет подходящего натурального ключа. Большинство сущностей (пользователь, заказ, статья) не имеют неизменяемого уникального бизнес-атрибута.
  • Натуральный ключ может измениться. Значения вроде email, номера телефона или паспорта подвержены изменениям.
  • Натуральный ключ составной или громоздкий. Ключ из 3-4 полей усложняет JOIN-ы и индексы.
  • Требуется максимальная производительность. Целочисленные ключи (BIGINT) быстрее для сравнения и занимают меньше места, чем строковые, что критично для индексов и внешних ключей.
  • Работаете с ORM (Hibernate, JPA). ORM-фреймворки оптимизированы для работы с единым суррогатным ключом.

Пример (JPA/Hibernate):

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // Синтетический ключ

    @Column(unique = true) // Естественный уникальный ключ, но не первичный
    private String email;

    private String name;
}

Преимущества:

  • Неизменяемость: Значение id никогда не меняется.
  • Простота: Одно поле, простой тип.
  • Производительность: Оптимально для индексов и связей.

Недостаток: Не несёт смысловой нагрузки, для поиска по бизнес-атрибутам всё равно нужны дополнительные индексы (например, на email).