Модель данных и схема

Основные сущности YDB:

  • таблица (table) — таблица для хранения типизированных строк данных;
  • директория (directory) — структура, позволяющая упорядочивать и систематизировать данные.

Таблица

Таблица содержит набор связанных данных, состоящий из строк и колонок. Каждая из строк представляет собой набор ячеек, предназначенных для хранения значений определенных типов в соответствии со схемой данных. Схема данных определяет имена (names) и типы (types) колонок таблицы.

YDB использует типы данных YQL, в качестве типов колонок могут использоваться простые типы данных. Все колонки могут содержать специальное значение NULL, используемое для обозначения отсутствия значения.

Таблица YDB всегда имеет один или несколько колонок, составляющих ключ (primary key). Строки таблицы уникальны по ключу, то есть для одного значения ключа может быть не больше одной строки. Таблица YDB всегда упорядочена по ключу. Это означает, что точечное чтение по ключу, а также диапазонные запросы по ключу выполняются эффективно (фактически используя индекс). Допускаются таблицы, состоящие только из ключевых колонок. Таблицы без первичного ключа создавать нельзя.

Часто при проектировании схемы таблицы имеется набор полей, естественным образом подходящий для использования в качестве первичного ключа. Тем не менее, к выбору ключа нужно подходить аккуратно, чтобы не создать хотспоты. Например, если вы вставляете в таблицу данные с монотонно возрастающим ключом, то вы будете писать в конец таблицы. А так как YDB разбивает данные таблицы по диапазонам ключей, это означает, что ваши вставки будут обрабатываться одним конкретным сервером, и перестанут использоваться основные преимущества распределенной БД. Для того, чтобы нагрузка равномерно распределялась по различным серверам и при обработке больших таблиц не было хотспотов, рекомендуется применять хэширование естественного ключа и использование хеша в качестве первой компоненты первичного ключа, а также изменение порядка следования компонент первичного ключа.

Шардирование таблиц

Таблица в БД может быть шардирована по диапазонам значений первичного ключа. Каждый шард таблицы отвечает за свой диапазон первичных ключей. Диапазоны ключей, обслуживаемых разными шардами, не пересекаются. Различные шарды таблицы могут обслуживаться разными серверами распределенной БД (в том числе расположенными в разных локациях), а также могут независимо друг от друга перемещаться между серверами для перебалансировки или поддержания работоспособности шарда при отказах серверов или сетевого оборудования.

При малом объеме данных таблица может состоять из одного шарда. При росте объема данных, обслуживаемых шардом, YDB автоматически разбивает увеличившийся шард на два. Разбиение происходит по медианному значению первичного ключа и основано на объеме данных: при превышении заданного порога объемом данных шарда, происходит разделение шарда на два.

Порог разделения шарда и включение/выключение автоматического разделения могут быть настроены индивидуально для каждой таблицы базы данных.

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

Важная информация

Настройка шардирования (Partitioning Policy) таблицы при ее создании в текущей версии возможна только через Java и Python SDK.

Иерархия сущностей

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