Проблема динамических данных в SaaS-приложениях
Каждое SaaS-приложение рано или поздно сталкивается с проблемой хранения динамических данных. Например, если у вас есть таблица пользователей и вдруг менеджер продукта хочет добавить возможность для пользователей сохранять свои настройки, такие как темный режим. Вы создаете миграцию, чтобы добавить столбец для темы. На следующей неделе появляется новое требование - добавить столбец для времени уведомлений. И так далее. В результате ваша таблица имеет множество nullable-столбцов, которые в основном пусты.
Решение с помощью PostgreSQL JSONB
Одним из решений этой проблемы является использование столбца JSONB в PostgreSQL. Этот тип данных позволяет хранить сырые JSON-данные в столбце, которые могут быть проиндексированы, запросы и отфильтрованы так же быстро, как и обычные целочисленные столбцы. В Laravel миграцию для добавления столбца JSONB можно создать очень просто:
Schema::table('users', function (Blueprint $table) {
$table->jsonb('preferences')->default('{}');
});
Работа с JSONB в Eloquent
Eloquent ORM в Laravel делает работу с JSONB очень простой. Добавив кастинг массива к вашей модели, Laravel автоматически конвертирует JSON-данные из базы данных в родной PHP-массив при чтении и обратно в JSON при сохранении.
class User extends Model {
protected $casts = [
'preferences' => 'array',
];
}
Теперь вы можете обновлять динамические настройки без необходимости создания новых миграций:
$user = User::find(1);
$user->preferences['theme'] = 'dark';
$user->preferences['marketing_emails'] = false;
$user->save();
Запросы внутри JSON
Поскольку это JSONB, вы можете создавать очень быстрые запросы直接 к ключам внутри JSON-пayload с помощью синтаксиса стрелки в Laravel.
// Найти всех пользователей, у которых включен темный режим
$darkUsers = User::where('preferences->theme', 'dark')->get();
Таким образом, вы можете избежать создания бесконечных миграций и хранить динамические данные в PostgreSQL JSONB, сохраняя при этом все преимущества реляционной базы данных.