
UUID мертв? Да здравствует Smart ID! Почему ваш проект заслуживает лучшего
wepko только что UUID мертв? Да здравствует Smart ID! Почему ваш проект заслуживает лучшего Средний 9 мин 0 PHP * Базы данных * SQL * Мнение Из песочницы В этой статье я поделюсь опытом проектирования идентификаторов...
Вот важная новость с фронта ИИ: wepko только что UUID мертв? Да здравствует Smart ID! Почему ваш проект заслуживает лучшего Средний 9 мин 0 PHP * Базы данных * SQL * Мнение Из песочницы В этой статье я поделюсь опытом проектирования идентификаторов для крупной медицинской системы.
Мы пройдем путь от простых автоинкрементов до UUID, ULID и в итоге создадим гибридное решение, которое оказалось лучше всех существующих подходов. Спойлер: идеальный ID — это не технология, а архитектура. Введение: Проклятие выбораКаждый разработчик сталкивался с дилеммой: что использовать в качестве первичного ключа?
Технические детали
// Вариант 1: Старый добрый автоинкремент $table->id(); // 1, 2, 3... // Вариант 2: Модный UUID $table->uuid('id ->primary(); // 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d // Вариант 3: Хайповый ULID $table->ulid('id ->primary(); // 01HXYZ1234ABC5678DEF90GH Казалось бы, бери новое — и будет счастье. Реальный кейс: Медицинская системаПредставьте: нам нужно построить систему для сети клиник с:1000+ врачей100000+ пациентов1M+ записей в годРаспределенными филиаламиВысокими требованиями к безопасностиНеобходимостью человеко-читаемых идентификаторовТребования из реального ТЗ:Распределенный доступ (каждый видит только свои данные)Защита от несанкционированного доступа (нельзя угадать ID)Архитектура расширения (новые типы данных)Интеграции (с 1С, CRM)Медицинские данные (особая чувствительность)Мысль 1: Анализ существующих решений1.
1 Автоинкремент (INT)Schema::create('doctors', function (Blueprint $table) { $table->id(); // 1, 2, 3, 4, 5... }); ✅ Плюсы:Скорость: JOIN-ы летают (4 байта, B-Tree индексы)Читаемость: /doctor/123 — сразу понятноПростота: никакой магииРазмер: минимальный❌ Минусы:Безопасность: ID можно угадатьШардинг: сложно мержить данныеПредсказуемость: видно количество записейНет типизации: все ID выглядят одинаковоВердикт: отличная производительность, но провал по безопасности. 2 UUID v4 (случайный)Schema::create('doctors', function (Blueprint $table) { $table->uuid('id ->primary(); // 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d }); ✅ Плюсы:Уникальность: глобально, хоть на МарсеБезопасность: нельзя угадатьРаспределенность: можно генерировать офлайн❌ Минусы:Скорость: JOIN-ы в 7 раз медленнее (16 байт, фрагментация)Читаемость: /doctor/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d — это пыткаРазмер: индексы раздутыОтладка: "найди запись с ID 9b1d...
" — спасибо, не надоВердикт: безопасно, но неудобно и медленно. 3 ULID (сортируемый UUID)Schema::create('doctors', function (Blueprint $table) { $table->ulid('id ->primary(); // 01HXYZ1234ABC5678DEF90GH }); ✅ Плюсы:Сортируемость: по времени созданияКомпактнее UUID: 26 символов вместо 36Уникальность: как у UUID❌ Минусы:Скорость: все еще строки, все еще медленноЧитаемость: чуть лучше UUID, но все еще "китайская грамота"Типизация: непонятно, врач это или пациентВердикт: шаг вперед, но не революция.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





