← Назад к вопросам

Какие знаешь виды ключей в БД?

1.0 Junior🔥 91 комментариев
#Хранение данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды ключей в базах данных

В реляционных БД ключи — это фундаментальная концепция для обеспечения целостности данных и оптимизации запросов. Как Flutter разработчик, часто приходится работать с локальными БД (SQLite) и удаленными API, поэтому понимание ключей критично.

Основные типы ключей

Первичный ключ (Primary Key)

  • Уникально идентифицирует каждую запись в таблице
  • Не может содержать NULL значения
  • Каждая таблица имеет ровно один первичный ключ
  • В SQLite часто используется INTEGER PRIMARY KEY AUTOINCREMENT
  • Пример: id пользователя, который автоматически генерируется при вставке

Внешний ключ (Foreign Key)

  • Ссылается на первичный ключ другой таблицы
  • Обеспечивает ссылочную целостность данных
  • Предотвращает удаление родительской записи, если на неё есть ссылки
  • В SQLite нужно явно включать: PRAGMA foreign_keys = ON
  • Пример: user_id в таблице posts ссылается на id в таблице users

Уникальный ключ (Unique Key)

  • Гарантирует уникальность значений в колонке
  • В отличие от PRIMARY KEY, может быть несколько и может содержать NULL
  • Полезен для email, username и других уникальных атрибутов
  • SQL: UNIQUE constraint на колонке

Составной/Композитный ключ (Composite Key)

  • Состоит из двух или более колонок
  • Комбинация значений должна быть уникальной
  • Используется когда одна колонка не может быть уникальным идентификатором
  • Пример: (user_id, post_id) в таблице likes

Практический пример для Flutter

// SQLite схема с разными типами ключей
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  email TEXT UNIQUE NOT NULL,
  username TEXT NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE posts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id INTEGER NOT NULL,
  title TEXT NOT NULL,
  content TEXT,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE likes (
  user_id INTEGER NOT NULL,
  post_id INTEGER NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (user_id, post_id),
  FOREIGN KEY (user_id) REFERENCES users(id),
  FOREIGN KEY (post_id) REFERENCES posts(id)
);

Индексы (Indexes)

Хотя индексы не являются ключами в строгом смысле, они тесно связаны:

  • PRIMARY KEY автоматически создаёт индекс
  • Индексы ускоряют поиск, но замедляют INSERT/UPDATE
  • В SQLite индексы полезны для FOREIGN KEY и поиска по часто используемым полям

Ключевые особенности в SQLite

  1. AUTOINCREMENT — автоматическое увеличение ID
  2. ON DELETE CASCADE — автоматическое удаление зависимых записей
  3. ON UPDATE CASCADE — автоматическое обновление ссылок
  4. Нужно помнить про PRAGMA для включения foreign_keys

Понимание ключей критично для проектирования хорошей архитектуры приложения и предотвращения потери или нарушения данных.

Какие знаешь виды ключей в БД? | PrepBro