Как устроена генерация
Этот раздел открыто объясняет механизм, стоящий за главным утверждением MockLab — без ограничения на количество записей, — достаточно подробно, чтобы вы могли оценить реальные компромиссы, а не просто поверить на слово.
Сид
У каждого ресурса есть seed: короткая случайная строка, назначаемая при создании ресурса.
Сид вместе с индексом записи (её позицией в списке — 0, 1, 2 и так далее) — единственный
вход, который вообще нужен генерации. При одном и том же сиде и одном и том же индексе одни и
те же типы полей в одном и том же порядке всегда дают одни и те же значения — на любой машине,
в любом процессе, без единой записи, когда-либо сохранённой в базу данных.
Механизм
Для индекса записи i сервер вычисляет числовой хеш от seed + ":" + i и использует его как
сид для маленького быстрого генератора псевдослучайных чисел. Каждое поле схемы затем берёт
значение из этого же генератора, в порядке следования полей в схеме — именно поэтому изменение
порядка полей в конструкторе схемы меняет то, что выдаёт каждое поле (сдвигается позиция каждого
поля в последовательности выборок), в то время как добавление опции к уже существующему полю
меняет только вывод этого конкретного поля. id записи намеренно генерируется из отдельной
последовательности, засеянной от seed + ":id:" + i — независимо от полей с данными, — именно
для того, чтобы редактирование полей схемы никогда не меняло id, уже выданные существующим
записям.
Именно поэтому генерация миллиона записей почти ничего не стоит: здесь нет ни поиска, ни строки базы данных, ни вообще какого-либо хранимого состояния на запись. Сервер выполняет небольшой объём арифметики на запись, на запрос, и только для тех записей, что попали в запрошенную вами страницу.
Что на самом деле хранится
Сами сгенерированные данные никогда не сохраняются. Единственное, что сохраняется, —
ваши переопределения: результат каждого POST, PUT, PATCH и DELETE, который вы сделали
(см. Создание, обновление и удаление). Запрос на чтение
генерирует запрошенное окно записей, накладывает поверх любые переопределения (заменяя
отредактированные записи, отбрасывая удалённые, добавляя вновь созданные), а затем фильтрует,
ищет, сортирует и разбивает результат на страницы.
Честный предел: 10 000 записей
Для ресурсов с 10 000 записей или меньше сервер материализует весь объединённый набор данных в
памяти один раз на версию данных и обслуживает из него фильтрацию, поиск и сортировку. Выше
10 000 фильтрация, поиск и сортировка полностью отключаются — работает только пагинация. Это не
маркетинговая сноска: ответ, затронутый этим ограничением, несёт настоящий, проверяемый
заголовок, X-MockLab-Notice: sort-filter-disabled-above-10000, так что ваш код (или вы сами,
глядя на вкладку сети) может распознать, что это произошло, вместо того чтобы молча получить
несортированные или нефильтрованные результаты.
const response = await fetch("https://mocklab.dev/m/demo7k2m9x/logs?sort=createdAt");
if (response.headers.get("X-MockLab-Notice") === "sort-filter-disabled-above-10000") {
console.warn("This resource is too large for sort/filter — showing unsorted pages instead.");
}
const records = await response.json();import { useQuery } from "@tanstack/react-query";
function useSortedRecords(sort) {
return useQuery({
queryKey: ["logs", sort],
queryFn: async () => {
const res = await fetch(`https://mocklab.dev/m/demo7k2m9x/logs?sort=${sort}`);
return {
records: await res.json(),
sortDisabled: res.headers.get("X-MockLab-Notice") === "sort-filter-disabled-above-10000",
};
},
});
}Тот же предел затрагивает и маршруты одиночных записей выше 10 000 записей, схожим образом:
GET, PUT, PATCH и DELETE по id работают только для записей, у которых уже есть
переопределение, потому что превратить произвольный id обратно в его индекс генерации означало
бы генерировать записи, пока одна из них не совпадёт, — именно тот неограниченный перебор,
ради предотвращения которого и существует этот предел. Ниже 10 000 записей ничего из этого не
действует: каждая запись сразу адресуема по id, сортировка и фильтрация всегда доступны, а
заголовок уведомления никогда не появляется. Будущая версия поднимет этот предел с помощью
настоящего индекса; пока же он честно задокументирован, а не скрыт.