Что такое вертикальное шардирование в базах данных?

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

Ответ

Вертикальное шардирование (вертикальное партиционирование) — это метод разделения таблицы базы данных по столбцам, при котором разные группы атрибутов хранятся в отдельных таблицах, часто на разных физических носителях или серверах.

Принцип работы: Исходная широкая таблица разбивается на несколько узких таблиц, связанных по первичному ключу. Часто используемые столбцы ("горячие данные") отделяются от редко запрашиваемых ("холодные данные").

Пример на SQL:

-- Исходная таблица
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    password_hash VARCHAR(255),
    email VARCHAR(100),
    profile_text TEXT,
    last_login TIMESTAMP,
    metadata JSON
);

-- После вертикального шардирования:
-- Таблица для частых операций (авторизация)
CREATE TABLE users_core (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    password_hash VARCHAR(255),
    email VARCHAR(100),
    last_login TIMESTAMP
);

-- Таблица для редко используемых данных
CREATE TABLE users_profile (
    user_id INT PRIMARY KEY REFERENCES users_core(id),
    profile_text TEXT,
    metadata JSON
);

Преимущества:

  • Увеличение производительности чтения — уменьшается объем данных, загружаемых в память при частых запросах
  • Улучшение кэширования — "горячие" данные эффективнее помещаются в кэш
  • Возможность разного хранения — разные типы данных можно хранить на оптимальных для них носителях (SSD для частых запросов, HDD для архивных данных)
  • Безопасность — чувствительные данные можно изолировать

Недостатки:

  • Усложнение JOIN-запросов — для получения полных данных требуются соединения таблиц
  • Нарушение атомарности операций — обновления нескольких таблиц требуют транзакций
  • Сложность поддержки целостности — необходимы внешние ключи и каскадные операции

Типичные сценарии использования:

  1. Разделение часто и редко запрашиваемых атрибутов (логин/пароль vs. биография)
  2. Изоляция BLOB/CLOB данных (изображения, документы) в отдельные таблицы
  3. Реализация multi-tenant архитектуры с общими и tenant-specific данными
  4. Оптимизация под column-oriented СУБД (ClickHouse, Vertica)