Башкы бетке

Генерация кантип иштейт

Бул барак MockLabдин негизги дааватынын — жазуу саны чектелбейт дегендин — артындагы механизмди ачык түшүндүрөт, ошондуктан анын чыныгы компромисстерин жөн эле ишенгендей эмес, ойлонуп баалай аласыз.

Seed

Ар бир ресурс seedге ээ: ресурс түзүлгөндө дайындалган кыска кокус сап. Seed, жазуунун индекси менен бирге (тизмедеги орду — 0, 1, 2, ушундай улана берет), генерация талап кыла турган жалгыз кириш. Так ошол эле seed жана так ошол эле индекс, так ошол эле талаа түрлөрү, так ошол эле тартипте берилсе, ар дайым так ошол эле маанилерди берет — кайсы машинада, кайсы процессте болбосун, эч бир жазуу маалымат базасына жазылбастан.

Механизм

i жазуу индекси үчүн, сервер seed + ":" + iдин сандык хешин эсептеп, аны кичине, тез псевдококулдук сан генераторун себүү (seed) үчүн колдонот. Схемадагы ар бир талаа андан кийин так ошол бир генератордон, талаалар схемада пайда болгон тартипте алат — так ушул себептен schema builder'де талааларды кайра иреттөө ар бир талаанын жообун өзгөртөт (ар бир талаанын ырааттуулуктан алган үлүшү жылат), ал эми учурдагы талаага опция кошуу ошол талаанын гана жообун өзгөртөт. Жазуунун 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 боюнча жеткиликтүү, иреттөө жана чыпкалоо ар дайым жеткиликтүү, жана эскертүү хедери эч качан пайда болбойт. Келечектеги версия бул чекти чыныгы индекс менен жогорулатат; азырынча ал жашырылбастан документтелген.