Что такое уникальный ключ (primary key) в контексте баз данных?

Ответ

Уникальный ключ (первичный ключ, primary key) — это атрибут или минимальный набор атрибутов таблицы, однозначно идентифицирующий каждую её запись (строку). Его значение должно быть уникальным и не равным NULL для всех строк в таблице.

Примеры в iOS-технологиях:

1. Core Data (атрибут с флагом): В модели данных (.xcdatamodeld) для атрибута устанавливается свойство "Primary Key".

// Entity "User" с атрибутом "id" как первичным ключом
@NSManaged public var id: UUID

2. Realm:

import RealmSwift

class User: Object {
    @Persisted(primaryKey: true) var _id: ObjectId // Авто-генерируемый
    // ИЛИ
    @Persisted(primaryKey: true) var userId: String // Пользовательский
}

3. SQLite (прямой запрос):

CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- Искусственный ключ
    email TEXT UNIQUE NOT NULL            -- Естественный ключ
);

Зачем он нужен?

  • Гарантия уникальности: Исключает дублирование записей.
  • Связи между таблицами: Используется как внешний ключ (foreign key) для создания отношений "один-ко-многим".
  • Эффективный поиск: Индексируется по умолчанию, что ускоряет операции SELECT, UPDATE, DELETE по ключу.
  • Типы ключей:
    • Естественный (Natural): Имеет смысл в предметной области (email, паспорт).
    • Суррогатный (Surrogate): Искусственный идентификатор без бизнес-смысла (UUID, автоинкрементное число).

Ответ 18+ 🔞

А, ну, первичный ключ, блядь! Это ж та самая штука, которая не даёт твоей базе данных превратиться в сраное безумное месиво, где всё повторяется и нихуя не понять, где что.

Представь, у тебя таблица с пользователями. И вот сидят там два Васька Пупкина. Какого хуя ты поймёшь, кому из них слать спам, а кого банить? Вот для этого и нужен этот самый ключ — атрибут, который у каждой записи свой, уникальный, и не может быть пустым. Как отпечаток пальца, только для строки в таблице.

Ну, смотри, как это в наших iOS-дебрях выглядит:

1. Core Data (старая, добрая хрень): Там в редакторе модели (.xcdatamodeld) просто тыкаешь галочку «Primary Key» для нужного поля. И всё, пиздец, магия.

// Сущность "User", и у неё есть "id" — наш главный пацан, ключ.
@NSManaged public var id: UUID

2. Realm (модная, быстрая тёлка): Тут вообще красота, прямо в объявлении класса помечаешь.

import RealmSwift

class User: Object {
    @Persisted(primaryKey: true) var _id: ObjectId // Случайный, сам родится
    // ИЛИ
    @Persisted(primaryKey: true) var userId: String // Твой собственный, например, почта
}

3. SQLite (старый, потрёпанный дед, который всё ещё охуенно стреляет): Прям по-старинке, SQL-запросом.

CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- Суррогатный ключ, сам растёт
    email TEXT UNIQUE NOT NULL            -- Естественный ключ, типа почта, которая и так уникальна
);

А нахуя вообще этот цирк?

  • Чтобы не было дублей, ёпта! Гарантия, что каждая запись — единственная и неповторимая мудя.
  • Чтобы таблицы дружили. Этот ключ потом тыкают в другие таблицы как внешний ключ (foreign key), и получаются связи. Один пользователь — много заказов, вот это всё.
  • Чтобы искать быстро. Под капотом оно индексируется, и SELECT-ы по нему летают как угорелые.
  • Какие они бывают?
    • Естественный (Natural): Имеет смысл в жизни. Типа номера паспорта или email. Но если email поменяется — начинается пиздец.
    • Суррогатный (Surrogate): Выдуманный, без смысла. Просто цифра, которая сама увеличивается, или UUID. Надёжно, как швейцарские часы, и бизнес-логику не ебёт. Чаще всего юзают именно его, чтобы не париться.