Какие виды ключей в базе данных ты знаешь?

«Какие виды ключей в базе данных ты знаешь?» — вопрос из категории Хранение данных, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При работе с базами данных в Flutter-приложениях (обычно через пакеты вроде sqflite или moor) я сталкиваюсь со следующими видами ключей:

  1. Первичный ключ (Primary Key, PK) — уникально идентифицирует каждую запись в таблице. Не может быть NULL. В sqflite часто реализуется как автоинкрементное поле id.

    // Пример создания таблицы с первичным ключом в sqflite
    await db.execute('''
      CREATE TABLE Users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL
      )
    ''');
  2. Внешний ключ (Foreign Key, FK) — создает связь между таблицами, ссылаясь на первичный ключ другой таблицы. Обеспечивает ссылочную целостность.

    await db.execute('''
      CREATE TABLE Orders (
        id INTEGER PRIMARY KEY,
        user_id INTEGER,
        FOREIGN KEY (user_id) REFERENCES Users(id)
      )
    ''');
  3. Уникальный ключ (Unique Key) — гарантирует, что все значения в столбце (или комбинации столбцов) уникальны. В отличие от PK, допускает одно значение NULL.

    await db.execute('''
      CREATE TABLE Products (
        id INTEGER PRIMARY KEY,
        sku TEXT UNIQUE
      )
    ''');
  4. Составной ключ (Composite Key) — первичный ключ, состоящий из двух или более столбцов. Используется, когда уникальность определяется их комбинацией.

    await db.execute('''
      CREATE TABLE OrderItems (
        order_id INTEGER,
        product_id INTEGER,
        quantity INTEGER,
        PRIMARY KEY (order_id, product_id)
      )
    ''');
  5. Суррогатный ключ — искусственный, не несущий бизнес-смысла ключ (например, автоинкрементный id). Чаще всего используется в Flutter-приложениях.

  6. Естественный ключ — первичный ключ на основе реальных бизнес-данных (например, email или номер паспорта). На практике в мобильных приложениях используется реже из-за возможных изменений этих данных.

Ключи критически важны для построения связей между данными, обеспечения целостности и оптимизации запросов через индексы.