Все когда-то доходят до того момента, когда автоинкрементные ID начинают раздражать. Особенно, когда у тебя распределённая система, куча сервисов или база, где дырки в ID палятся моментально.
Вот тут на сцену выходит UUID — строка-уродец длиной в 36 символов, которая гарантирует, что два твоих объекта не пересекутся. Даже если они родились на разных серверах и не знают друг о друге.
Но за всё надо платить. UUID — это жирный ключ, который тормозит индексы, увеличивает размер базы и делает твои джойны похожими на больное месиво. Поэтому включать UUID просто потому что "так модно" — это как ставить спойлер на «Приору». Вроде красиво, но толку — ноль.
Вариант 1. Сторонний пакет
ramsey/uuid — дед в мире UUID, проверенный временем.
composer require ramsey/uuid
Дальше в модели:
use Illuminate\Database\Eloquent\Model;
use Ramsey\Uuid\Uuid;
class Post extends Model
{
public $incrementing = false;
protected $keyType = 'string';
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string) Uuid::uuid4();
});
}
}
Теперь у тебя ключи не автоинкрементные циферки, а строковые монстры.
Вариант 2. Стандартный от Laravel
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Post extends Model
{
public $incrementing = false;
protected $keyType = 'string';
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string) Str::uuid();
});
}
}
Никаких пакетов, всё на борту. Разница минимальная.
Миграции под UUID
Миграция проста как лом:
Schema::create('posts', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('title');
$table->text('body');
$table->timestamps();
});
И всё, у тебя таблица с UUID.
Где реальный профит
— Микросервисы. Когда таблицы рождаются в разных базах и потом стыкуются — автоинкрементный id превращается в минное поле. UUID тут реально спасает.
— Безопасность. Никто не будет угадывать "пользователь №17" или "заказ №1337". Для API это уже не баг, а фича.
— Репликация. Когда у тебя база в нескольких датацентрах и они все пишут данные. Тут без UUID ты просто упрёшься в конфликты.
Где боль
— Размер. UUID в 4 раза жирнее INT. Индексы пухнут, джойны дохнут.
— Читаемость. id = 42 я запомню. id = 550e8400-e29b-41d4-a716-446655440000 — ну попробуй продебажить с этим счастьем.
— Производительность. Чем больше у тебя данных, тем быстрее ты начнёшь жалеть, что не остановился на автоинкременте.
Финалочка
UUID — это инструмент, а не украшение. В Laravel его воткнуть легко, но нужно задать себе честный вопрос: ты реально работаешь с распределёнными системами или просто решил "поиграться с модным словом"? Если второе — оставь себе обычный id. Если первое — UUID тебе жизнь упростит, но за это придётся платить скоростью и нервами.
0 комментариев