# Побудувала систему лояльності та репутації — 67 функцій на основі реєстру з 31 таблиці, з лігами, бейджами та крамницею обміну, — і блокувала рядок балансу, щоб закрити вікно для подвійного витрачання.

2025

**Ситуація.** Професійні соцмережі мають проблему холодного старту: платформою варто користуватися тоді, коли нею вже користуються інші, а доти майже немає причин повертатися. Звичний важіль — система винагород: бали за внесок, статус, що відображає репутацію. Описати її легко, а от побудувати — справа підступна, бо щойно бали можна витратити, вони стають грішми, і будь‑якої помилки, якої припускаються з грішми, можна припуститися й тут.

**Завдання.** Внесок треба було вимірювати й винагороджувати, а баланс — зробити таким, щоб його не можна було витратити двічі.

**Дія.** Схема лояльності налічує 31 таблицю та 67 функцій, статус — ще 5 таблиць і 32 функції, а поруч — схеми discovery й персоналізації, які вирішують, що саме бачить конкретний учасник. Над реєстром надбудовано ліги, бейджі та крамницю обміну, де баланс перетворюється на щось реальне. Найбільше уваги забрав найстаріший баг, який тільки буває: перевірити баланс, потім списати його — і два запити, що прийшли одночасно, обидва проходять перевірку. Кожна зміна спершу блокує рядок гаманця й лише потім його читає, тож другий запит чекає, доки завершиться перший, а не женеться з ним наввипередки. А можливим це стає лише тому, що гаманець лежить у тій самій базі даних, що й усе інше: баланс і те, що на нього куплено, комітяться разом або не комітяться зовсім.

**Результат.** Внесок вимірюється й винагороджується, а баланс — це арифметика, а не наближення. Блокування рядків — повільніший варіант, і все ж обрали саме його: конкуренція за гаманець просто змушує запити виконуватися по черзі, а альтернатива — учасник, який витрачає ті самі бали двічі, і хтось, хто потім вручну все це звіряє.

---

- Роль: Інженер баз даних
- Категорії: [Backend‑розробка](https://data.engineer.company/uk/categories/backend/), [Бази даних](https://data.engineer.company/uk/categories/databases/), [PostgreSQL](https://data.engineer.company/uk/categories/postgresql/), [SQL](https://data.engineer.company/uk/categories/sql/), [Оптимізація продуктивності](https://data.engineer.company/uk/categories/performance/), [Продукт і вимоги](https://data.engineer.company/uk/categories/product/)
- Послуги: [Backend- та API‑розробка](https://data.engineer.company/uk/services/backend-development/), [Проєктування та моделювання баз даних](https://data.engineer.company/uk/services/database-design/), [Продуктова стратегія та вимоги](https://data.engineer.company/uk/services/product-strategy/)

<https://data.engineer.company/uk/portfolio/built-the-loyalty-and-reputation-system-105/>
