> Что такое side table (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Masterdata

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Side table - это вспомогательная таблица в базе данных, которая хранит данные, связанные с основной таблицей через внешний ключ. В iOS-разработке side table часто используется в Core Data или SQLite для хранения дополнительных атрибутов, которые не помещаются в основную таблицу (например, большие бинарные данные или редко используемые поля). Это позволяет оптимизировать производительность и уменьшить размер основной таблицы.

Подробное объяснение

Side table - это архитектурный паттерн организации данных, при котором основная таблица содержит только часто используемые и компактные поля, а редко используемые или тяжёлые данные выносятся в отдельную таблицу. Связь между ними устанавливается через primary key и foreign key.

В контексте iOS и Swift это особенно актуально при работе с Core Data, где entity может иметь relationship типа to-one на другую entity, которая выступает как side table. Например, если у вас есть entity User с полями name и avatarData (большой Data), вы можете вынести avatarData в отдельную entity UserAvatar, связанную с User через relationship.

Основные причины использования side table:

  • уменьшение размера строк основной таблицы, что ускоряет сканирование и индексацию
  • разделение часто и редко используемых данных для оптимизации кэширования
  • возможность хранить опциональные или редко заполняемые поля без NULL-значений в основной таблице
  • упрощение миграций при изменении структуры данных

На практике

В iOS-приложениях side table чаще всего встречается при работе с Core Data или GRDB (SQLite wrapper). Типичный сценарий - хранение больших изображений, аудиофайлов или JSON-блобов отдельно от основных атрибутов сущности.

Пример из реального проекта: у вас есть список чатов (entity Chat), и для каждого чата нужно хранить последнее сообщение с превью. Вместо того чтобы хранить lastMessageText и lastMessagePreviewData прямо в Chat, вы создаёте отдельную entity ChatMeta с relationship to-one от Chat. Это позволяет быстро загружать список чатов без чтения тяжёлых данных превью.

Также side table используется для реализации паттерна "снимок состояния" (snapshot), когда нужно хранить историю изменений атрибутов без изменения основной таблицы.

Пример кода

SWIFT
import CoreData
// Основная сущность
@objc(Chat)
public class Chat: NSManagedObject {
@NSManaged public var id: UUID
@NSManaged public var name: String
@NSManaged public var meta: ChatMeta?
}
// Side table сущность
@objc(ChatMeta)
public class ChatMeta: NSManagedObject {
@NSManaged public var lastMessageText: String?
@NSManaged public var lastMessagePreview: Data?
@NSManaged public var chat: Chat?
}
// Использование
let chat = Chat(context: context)
chat.id = UUID()
chat.name = "Work"
let meta = ChatMeta(context: context)
meta.lastMessageText = "Hello"
meta.lastMessagePreview = imageData
meta.chat = chat
try context.save()

Как отвечать на собеседовании

Начните с простого определения, затем приведите пример из iOS-разработки. Подчеркните практическую пользу: оптимизация производительности, уменьшение размера основной таблицы, удобство миграций. Если спросят про Core Data - упомяните relationship to-one как реализацию side table. Не углубляйтесь в сложные детали SQL, если не просят. Покажите, что понимаете trade-off: side table добавляет сложность запросов (нужен join), но окупается при больших объёмах данных.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание базовых принципов проектирования баз данных
  • умение применять паттерны в контексте iOS (Core Data, SQLite)
  • осознание trade-off между нормализацией и производительностью
  • способность объяснить архитектурное решение простыми словами

Типичные ошибки

  • путать side table с view или материализованным представлением
  • утверждать, что side table - это обязательно отдельный файл или база данных
  • не упоминать связь через foreign key
  • говорить, что side table нужна только для больших данных - на самом деле она полезна и для редко используемых полей
  • забывать про overhead на join-запросы при чтении данных

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью