Щось, що важливо робити, коли ми маємо дискусію, як це - чітко розмежувати між об'єктними реляційними картографами ("ORM") та шарами абстракції бази даних . ORM - це різновид шару абстрагування бази даних, але не всі шари абстракції бази даних є ОРМ. Хорошим інструментом для вивчення цього є популярна бібліотека SQLAlchemy Python, яка вважає себе "інструментарієм SQL та об'єктивним реляційним картографом" (мій жирний шрифт) з думкою, що це різні речі. Як вони розміщують це на своїй сторінці основних функцій :
Не потрібно ORM
SQLAlchemy складається з двох різних компонентів, відомих як Core і ORM . Core є самим повнофункціональним інструментарієм абстракції SQL, що забезпечує гладкий шар абстрагування для широкого спектру реалізацій та поведінки DBAPI, а також мову експресії SQL, яка дозволяє виражати мову SQL за допомогою генеративних виразів Python. Система подання схем, яка може випромінювати оператори DDL, а також самоаналіз існуючих схем, і система типів, яка дозволяє будь-яке відображення типів Python на типи баз даних, округляє систему. Обліковий реляційний Mapper - це необов'язковий пакет, який базується на ядрі.
На головній сторінці описано ОРМ так:
SQLAlchemy є найвідомішим своїм об'єктно-реляційним картографом (ORM), необов'язковим компонентом, який забезпечує схему відображення даних, де класи можуть бути перенесені в базу даних відкритим способом декількома способами - дозволяючи моделю об'єкта та схемі бази даних розвиватися в чисто розв'язаний шлях від початку.
Ключова ідея ОРМ полягає в тому, щоб спробувати усунути відому невідповідність об'єктно-реляційного опору . Це означає визначення взаємозв'язку між визначеними користувачем класами до таблиць у схемі бази даних та надання автоматичних операцій "збереження" та "завантаження" для класів вашої програми.
На відміну від цього, шари абстракції баз даних, що не належать до ORM, як правило, більш прихильні до реляційної моделі даних та до SQL, а зовсім не до об'єктно-орієнтованої. Таким чином, замість того, щоб відображати "відображення" між таблицями та класами і ховати схему бази даних від програміста, вони, як правило, піддають базу даних програмісту, але з кращими API та абстракціями. Наприклад, конструктори запитів SQL дозволяють генерувати складні запити SQL програмно, без обробних рядків, як це ( приклад з бібліотеки jOOQ для Java ):
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(1948))
.fetch();
Тепер, начебто , система Play не відповідає 100% того, що я описав , але їх аргумент, здається, знаходиться в цьому загальному просторі: працюйте з реляційною моделлю безпосередньо замість того, щоб перекладати її на класи та назад від них.
Бібліотеку jOOQ варто вивчити як контрапункт ORM. У них також є відповідні записи в блозі, які варто прочитати: