Cóż, jedną rzeczą, którą należy zrobić, gdy mamy taką dyskusję, jest wyraźne rozróżnienie między obiektowymi obiektami mapującymi obiekty („ORM”) a warstwami abstrakcji bazy danych . ORM jest rodzajem warstwy abstrakcji bazy danych, ale nie wszystkie warstwy abstrakcji bazy danych są ORM. Jednym z dobrych narzędzi do nauki, aby to zrozumieć, jest popularna biblioteka SQLAlchemy Pythona , która wystawia rachunek jako „zestaw narzędzi SQL i obiektowy obiektowy mapator” (moja pogrubiona czcionka), z myślą, że są to różne rzeczy. Po umieszczeniu go na stronie z kluczowymi funkcjami :
Nie wymaga ORM
SQLAlchemy składa się z dwóch różnych składników, znanych jako Core i ORM . Sam rdzeń jest w pełni funkcjonalnym zestawem narzędzi do abstrakcji SQL, zapewniając gładką warstwę abstrakcji w szerokim zakresie implementacji i zachowań DBAPI, a także język SQL Expression Language, który umożliwia wyrażanie języka SQL za pomocą generatywnych wyrażeń Python. System reprezentacji schematu, który może zarówno emitować instrukcje DDL, jak i introspekcję istniejących schematów, oraz system typów, który umożliwia dowolne mapowanie typów Pythona na typy baz danych, stanowi dopełnienie systemu. Object Relational Mapper to opcjonalny pakiet oparty na rdzeniu.
Pierwsza strona opisuje ORM w następujący sposób:
SQLAlchemy jest najbardziej znany ze swojego mapowania obiektowo-relacyjnego (ORM), opcjonalnego komponentu zapewniającego wzorzec mapowania danych, w którym klasy mogą być mapowane do bazy danych w sposób otwarty, na wiele sposobów - umożliwiając rozwój modelu obiektowego i schematu bazy danych w czysto oddzielony sposób od samego początku.
Kluczową ideą ORM jest próba pokonania słynnego niedopasowania impedancji relacyjnej względem obiektu . Oznacza to zdefiniowanie zależności między klasami zdefiniowanymi przez użytkownika a tabelami w schemacie bazy danych oraz zapewnienie automatycznych operacji „zapisywania” i „ładowania” klas aplikacji.
Natomiast warstwy abstrakcji baz danych inne niż ORM są bardziej zaangażowane w relacyjny model danych i SQL, a wcale nie w orientację obiektową. Zamiast więc oferować „odwzorowania” między tabelami i klasami i ukrywać schemat bazy danych przed programistą, mają tendencję do wystawiania bazy danych programistom, ale z lepszymi interfejsami API i abstrakcjami. Na przykład konstruktory zapytań SQL umożliwiają programowe generowanie złożonych zapytań SQL, bez manipulacji ciągami, takich jak ten ( przykład z biblioteki jOOQ dla 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();
Teraz środowisko Play nie wydaje się być w 100% zgodne z tym, co właśnie opisałem , ale ich argument wydaje się być w tej ogólnej przestrzeni: praca z modelem relacyjnym bezpośrednio zamiast przekładania go na klasy iz powrotem.
Biblioteka jOOQ jest warte studiowania jako kontrapunkt do ORMs. Mają też kilka odpowiednich wpisów na blogu, które warto przeczytać: