Комментарии (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
- AUTOINCREMENT — автоматическое увеличение ID
- ON DELETE CASCADE — автоматическое удаление зависимых записей
- ON UPDATE CASCADE — автоматическое обновление ссылок
- Нужно помнить про PRAGMA для включения foreign_keys
Понимание ключей критично для проектирования хорошей архитектуры приложения и предотвращения потери или нарушения данных.