Чому ORM не має бути найкращою ставкою

Коли я почав програмувати, кілька років тому ORM був схожий на життєву кров програмних проектів. Навколишнє середовище підкреслювало тісний зв'язок між кодовою базою та шаром ORM. Можна сказати, що мене навчили не думати про проекти без ОРМ.

Але коли я набув досвіду та глибших знань щодо конкретних проектів, я зрозумів, що більшість вдосконалень в кінцевому рахунку доходить до того моменту, коли потік входить у рамки ORM. Тоді я запитав себе: а якби цей проект не мав ORM?

Я почав думати про проблеми, які ORM представив:

  • Ви не можете оптимізувати свій код, навіть якщо вам справді потрібен додатковий сплеск швидкості; Код ORM живе у власній країні.
  • Видимість того, що відбувається, є як мінімум.
  • Документація зазвичай є масовою та фрагментарною, що ускладнює пошук конкретних даних.

Це може здатися невеликими проблемами, але вони значно погіршують продуктивність. Крім цього, я зрозумів, що екосистема ORM відмежована від основної веб-розробки з власним брендом питань та обмежень. ORM, як правило, приносить зайву складність, забезпечуючи "нещільну абстракцію" над взаємодією бази даних. Іноді вони мають круту криву навчання, і розробники схильні ставитися до них як до чорних ящиків.

Я бачив, як розробники застосовують різні підходи для вирішення проблеми ORM. Деякі повністю видаляють рамки ORM, що часто є геркулесовим завданням, залежно від складності проекту. Деякі приймають ORM та адаптують код у своєму проекті; вони готові йти на компроміс у виконанні і не піклуються про додаткову складність. Багато з них обирають золотий шлях, де вони продовжують використовувати ORM, але нові або складні запити виключаються. Деякі з них фактично створюють власний шар відображення, специфічний для проекту та відповідно до потреби.

Поки що я працював з Hibernate (Java) та Mongoose (ORM Framework у Node for MongoDB). Коли я прийшов до проекту Node, який вже використовував Mongoose як ORM, у мене було монументальне завдання переробити майже весь проект. Спочатку я думав про те, щоб взагалі зняти рамки ORM. Але мої колеги не були б задоволені, коли б число не підтримало мене. Тому я орієнтував час запитів з мангустом і без нього. Ось результати.

Вони взяли мене зненацька. Я очікував підвищення продуктивності, коли не використовував Mongoose, але не в цій мірі. Маючи ці дані, вибір був очевидним: ORM вийшов. Через кілька місяців колега запитав мене, чи слід використовувати Sequelize або Pg для доступу до бази даних Postgres. Зрозумівши, що Sequelize є ОРМ, я віддав свій голос Pg, але попросив його визначити їх двома. Я хотів перевірити, чи виправдана була ненависть до ОРМ, і як тільки цифри повернулися, виявляється, що це було цілком виправдано.

Здогадайтесь, з якою бібліотекою він попереду.

Що слід пам’ятати тут, коли ми відмовились від ORM, будь то мангуста чи секвелізуватись, ми усвідомлювали, що це відмовлялося. Зокрема, перевірка схем, заздалегідь побудовані методи, абстракції тощо були основними аспектами використання рамки ORM. Основне занепокоєння викликало відсутність перевірки схеми (коли не використовуються ORM), що може призвести до поганих даних, що надходять до БД. Щоб обійти це, ми використали Джой, що полегшило наше завдання, зберігаючи продуктивність недоторканою. Для інших частин нам потрібно було написати кілька рядків додаткового коду, але воно того варте. Краще, ніж втратити десятки мілісекунд (іноді навіть секунди) на кожен запит.

Я не намагаюсь бити ORM, і вони справді хороші для початківців і малих проектів. Але коли ваш проект розширюється до великої кількості запитів та документів, ORM можуть стати вузьким місцем. Розглядайте їх як війну у В'єтнамі, вам потрібно вирішити, коли витягнути та бігти, інакше велика шкода неминуча.