3 Годувальник доками 4 Гід-напрямний 5 Майже архітектор ~10 хв

Бази даних для новачка: таблиці, індекси та міграції

Де живуть дані твого сайту і як випадково не знести їх однією командою

Що таке база даних простими словами: таблиці, індекси, міграції та типи колонок. Розбираємо головні граблі вайбкодера - і як їх обійти заздалегідь.

Скіли ECC у цьому уроці: postgres-patternsprisma-patterns

Що таке база даних простими словами

Уяви величезну картотечну шафу зі старої бібліотеки. Усередині - шухляди (це таблиці). У кожній шухляді лежать картки (це рядки). А на кожній картці заповнені одні й ті самі поля: імʼя, дата, телефон (це колонки). Усе. Жодної магії.

Ось ця розумна шафа і є база даних . Усе, що твій застосунок має памʼятати назавжди - хто зареєструвався, що замовили, який пост вподобали - живе саме тут. Закрив сайт, вимкнув сервер, спіткнувся об провід і знеструмив пів кварталу - дані на місці.

А розмовляє застосунок із шафою не по-людськи, а окремою мовою - SQL. Це як записка бібліотекарю: «принеси всі картки, де місто = Київ». Зубрити SQL напамʼять тобі як вайбкодеру не треба - його пише агент або розумний прошарок. Але розуміти, що саме агент просить у шафи, дико корисно. Інакше він одного разу попросить «винеси взагалі все», а ти й оком не змигнеш.

Картотечна шафа-робот: шухляди-таблиці, картки-рядки, до кожної колонки підпис
Таблиця - шухляда, рядок - картка, колонка - поле в картці.

Навіщо вайбкодеру розуміти базу даних

Рано чи пізно твій сайт перестане бути гарненькою картинкою і захоче щось запамʼятовувати: список замовлень, акаунти, коментарі. Ось тут і зʼявляється база даних. А разом із нею - цілий зоопарк помилок, від яких сайт або гальмує, або тихо втрачає дані. Тихо - це найгидкіше.

Розумієш, як влаштована шафа - і одразу виграєш чотири речі:

  • не панікуєш, коли агент кидає слова «міграція» та «індекс»;
  • не даєш агенту через незнання стерти всю таблицю однією командою;
  • отримуєш швидкий сайт, а не такий, де список вантажиться по 10 секунд і користувач устигає втекти до конкурента;
  • ставиш задачу так, що агент робить правильно з першого разу.

Уся різниця між «мій сайт іноді втрачає замовлення і гальмує» та «все літає і нічого не пропадає» зводиться до трьох слів: тип колонки, індекс, міграція. Поїхали.

Як агент працює з базою даних: чотири кити

1. Таблиці та типи колонок: форма картки

Заводиш шухляду (таблицю) - одразу для кожного поля скажи, що в ньому лежить: текст, число, дата, «так/ні». Це і є тип колонки. Схибиш із типом - потім переробляти довго і боляче.

У досвідчених є готові правила, що чим зберігати (це прямо зі скілу postgres-patterns):

Правильні типи
  • Гроші - типом numeric (точне число), щоб 0.1 + 0.2 не перетворилося на 0.30000004.
  • Дата і час - timestamptz (з часовим поясом), щоб клієнт із Балі та з Києва бачили правильний час.
  • Текст - просто text, без штучних лімітів довжини.
  • Галочка так/ні - boolean, а не рядок «yes»/«no».
Чим НЕ треба зберігати
  • Гроші через float - дробові копійки їдуть у туман, бухгалтерія плаче.
  • Дата через звичайний текст - потім ні відсортувати, ні порівняти.
  • «Так/ні» цифрою 1 і 0 або рядком - щоразу гадаєш, що це взагалі означає.
  • Ціна рядком «1000 грн» - ану додай таке з «990 грн».
Мем: спокійний кіт за float і той самий кіт у паніці, коли в сумі зʼявилися зайві девʼятки
float і гроші: спершу здається, що все ок.

2. Що таке індекс у базі даних

Уяви телефонну книгу, де імена йдуть упереміш. Щоб знайти «Петрова», ти читаєш її всю з першої сторінки. Тисяча сторінок - тисяча сторінок читання заради одного імені. Ось так і працює база даних без індексу. Повільно і прикро.

Індекс - це той самий алфавітний покажчик. Кажеш шафі: «тримай окремий зміст по полю email» - і пошук за email стає миттєвим. Без «прочитай мільйон карток і спітній».

3. Що таке міграція бази даних

Сайт росте, і в картку треба додати нове поле - скажімо, «телефон». Лізти в живу шафу руками небезпечно: щось та зачепиш. Тому зміни структури роблять міграціями - записаними по кроках «кресленнями ремонту».

І ось тут живе НАЙнебезпечніша грабля вайбкодера. Команда, якою агенти зазвичай рухають ці креслення, називається migrate dev. За певних умов вона питає дозволу стерти всю базу: якщо дані «не сходяться з кресленням», вона обнуляє таблиці цілком (це прямо зі скілу prisma-patterns). Один клік «так» - і привіт.

Двоє робітників біля шафи: один із маленьким кресленням акуратно докручує полицю, другий замахується кувалдою
migrate deploy - акуратний ремонт. migrate dev на проді - кувалда.

4. Небезпечні команди: deleteMany та updateMany

Є команди, які змінюють або видаляють багато карток разом. Потужні - і тому підступні. Дві головні пастки (обидві з prisma-patterns):

  • deleteMany без умови стирає ВСЕ. Хотів видалити замовлення одного клієнта, забув дописати «чиї саме» - і шафа мовчки винесла всю шухляду. Без питань. Без «ви точно впевнені?». Без кошика.
  • updateMany повертає число, а не записи. Масово щось поміняв і думаєш, що отримав назад оновлені картки. А отримав суху цифру «змінено: 5 штук». Хто ці пʼятеро - зʼясовуй окремим запитом.

Приклад із життя: як ламається інтернет-магазин

Робиш з агентом інтернет-магазинчик. Спершу все чудово: пʼять товарів, три замовлення, літає як ракета. За місяць у тебе тисяча замовлень - і ось розплата:

  1. Сторінка «мої замовлення» вантажиться 8 секунд - бо немає індексу за полем «покупець», і база щоразу перечитує всю таблицю.
  2. У звіті сума замовлення «1499.9999998» - бо ціну зберегли як float, а не numeric.
  3. Ти попросив агента «видали тестові замовлення», він запустив deleteMany без умови - і зніс усі замовлення, включно з бойовими.

Жодна з цих бід - не «глюк ШІ». Це три зрозумілі граблі, і всі три знімаються однією грамотною постановкою задачі:

Промпт - скопіюй і спробуй

Спроєктуй базу даних для інтернет-магазину. Дотримуйся правил:

  1. Ціну зберігай точним числом для грошей (numeric), НЕ дробовим float. Дату і час - з часовим поясом.
  2. Постав індекс на кожне поле, за яким будемо шукати або сортувати: покупець, дата створення, статус замовлення.
  3. Будь-яку масову команду видалення чи оновлення роби ТІЛЬКИ з умовою, над якими саме записами працюємо. Без умови - стоп.
  4. Команду migrate dev використовуй лише локально. Для бойового сервера готуй migrate deploy. Перед видаленням чого-небудь спершу покажи мені план.
  5. Поясни простими словами, які таблиці ти створив і навіщо кожна.

Хитрість про швидкість: курсорна пагінація

Коли список довгий (стрічка постів, замовлення, товари), новачки просять «дай мені сторінку 50». Щоб її віддати, база змушена відлічити й перегорнути перші 49 сторінок намарно. Чим далі сторінка - тим сильніше вона крекче.

Досвідчені роблять курсорну пагінацію : «дай 20 штук після останньої показаної». Швидкість однакова - хоч на першій сторінці, хоч на тисячній. Агент сам не запропонував? Просто попроси: «зроби гортання стрічки курсором, а не за номерами сторінок».

Часті помилки новачка в базах даних

  • Зберігаєш гроші через float. Отримаєш дробові копійки і криві суми. Тільки numeric.
  • Забув про індекси. На маленьких даних непомітно, на великих сайт гальмує намертво. Індексуй поля пошуку і сортування.
  • Запустив migrate dev на бойовому сайті. Може стерти всю базу. На проді - тільки migrate deploy.
  • Масово видаляєш або змінюєш без умови. deleteMany без умови зносить усю таблицю. Завжди вказуй «над ким».
  • Думаєш, що updateMany поверне записи. Він поверне лише число. Самі оновлені картки діставай окремим запитом.
  • Не робиш бекап перед небезпечною операцією. Резервна копія - твоя машина часу. Один раз врятує весь проєкт.

TL;DR - если коротко

  • База даних - розумна шафа з картотекою. Таблиці - шухляди, рядки - картки, колонки - поля.
  • Індекс - зміст. Немає його - база читає всю шухляду заради однієї картки і дико гальмує.
  • Міграція - ремонт шафи за кресленням. `migrate dev` вміє стерти все - їй місце на твоєму компі, не на проді.
  • `deleteMany` без умови зносить усю таблицю. `updateMany` віддає число, а не самі записи. Запамʼятай обидва.
  • Гроші - лише точним `numeric`. Інакше одного разу в кошику опиниться «99.99999999 гривні».
  • Не проси агента «зроби базу абияк». Задавай типи, індекси та правила видалення заздалегідь.

Пошук по вікі

Натисніть Esc для закриття

Введіть запит для миттєвого пошуку по всіх сторінках курсів та уроків.