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

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

Ответ

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

Противоположность — естественный ключ (Natural Key), который формируется из атрибутов предметной области (например, номер паспорта, email).

Пример синтетического ключа в Java (JPA/Hibernate):

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Автоинкремент в БД
    private Long id; // Синтетический ключ

    @Column(unique = true)
    private String email; // Бизнес-идентификатор (естественный ключ)

    private String name;
    // ...
}

Преимущества синтетических ключей:

  • Стабильность: Не изменяется при эволюции бизнес-правил (в отличие от email или паспорта).
  • Простота: Обычно это одно целочисленное поле, что эффективно для индексов и соединений (JOIN).
  • Конфиденциальность: Не раскрывает бизнес-информацию в URL или API (в отличие от использования email как ID).
  • Универсальность: Все сущности могут иметь ключ одного типа (BIGINT, UUID).

Недостатки:

  • Требует дополнительного поля и индекса.
  • Не гарантирует уникальность бизнес-данных (нужны дополнительные ограничения UNIQUE на поля вроде email).
  • Может быть менее интуитивным при ручном анализе данных.

Распространенные типы: автоинкрементные числа (SERIAL, AUTO_INCREMENT), UUID, последовательности (Sequence).