Co to jest ORM, jak to działa i jak go użyć? [Zamknięte]

230

Ktoś zasugerował, że używam ORM do projektu, który projektuję, ale mam problem ze znalezieniem informacji o tym, co to jest lub jak działa.

Czy ktoś może mi krótko wyjaśnić, czym jest ORM i jak działa i jak powinienem zacząć z niego korzystać?

Ryan
źródło
8
Znalazłem to pytanie, ale pochodzi z 2009 roku i nie wiem, czy już opanowałeś ORM, ale poszukaj Entity Framework w CodePlex C # ( entityframework.codeplex.com ) Oto kod źródłowy, z którego możesz się uczyć. Możesz także to przeczytać. ( dbtechnet.org/labs/dae_lab/Orm.pdf )
Maximus Decimus
1
Chcę tylko zaznaczyć, że kamera ORM odnosi się również do modelowania ról obiektowych en.wikipedia.org/wiki/Object-role_modeling
O-9
1
To przydatne pytanie, a głosy na najlepszą odpowiedź wydają się to potwierdzać. Krótki opis tego, czym jest ORM, nie wymaga opinii. Tylko dlatego, że użytkownik prosi o link, aby rozpocząć, pytanie jest oznaczone jako nie na temat. Uważam, że jest to częsta nadmierna reakcja moderatorów.
NeilG
3
@NeilG Pytanie zamknięte oznacza, że ​​pytanie jest nie na temat. W odpowiedziach mogą znajdować się przydatne informacje, ale to nie stawia pytania na temat. Ponadto nie zostanie usunięty, pozostanie tutaj, ale nadal musimy utrzymywać SO w czystości i na temat, aby działała jak najlepiej. Tak więc, aby odpowiedzieć na twój pierwszy komentarz: To nie jest przydatne pytanie, są przydatne odpowiedzi.
M--
1
@NeilG Problem polega na tym, że pytanie zawiera prośbę o zasoby (zarówno w tytule, jak i w pytaniu). Takie żądania są nie na temat, głównie dlatego, że ludzie po prostu publikują link do swoich ulubionych zasobów, tak jak to miało miejsce w kilku odpowiedziach tutaj. Usunięcie prośby o zasoby z pytania unieważniłoby niektóre istniejące odpowiedzi. Jako zwykli użytkownicy nie możemy edytować pytania w celu unieważnienia odpowiedzi. Dlatego powinien zostać zamknięty. Jeśli na pytanie nie udzielono odpowiedzi, można je edytować, aby usunąć te żądania i pozostawić otwarte.
Makyen

Odpowiedzi:

483

Wprowadzenie

Mapowanie obiektowo-relacyjne (ORM) to technika, która pozwala na zapytania i manipulowanie danymi z bazy danych przy użyciu paradygmatu obiektowego. Mówiąc o ORM, większość ludzi odnosi się do biblioteki, która implementuje technikę mapowania obiektowo-relacyjnego, stąd wyrażenie „ORM”.

Biblioteka ORM to całkowicie zwykła biblioteka napisana w wybranym języku, która zawiera kod potrzebny do manipulowania danymi, więc nie używasz już SQL; wchodzisz w interakcję bezpośrednio z obiektem w tym samym języku, którego używasz.

Na przykład tutaj jest całkowicie wyimaginowany przypadek z pseudo-językiem:

Masz klasę książek, chcesz odzyskać wszystkie książki, których autorem jest „Linus”. Ręcznie zrobiłbyś coś takiego:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

W przypadku biblioteki ORM wyglądałoby to tak:

book_list = BookTable.query(author="Linus");

Część mechaniczna jest obsługiwana automatycznie przez bibliotekę ORM.

Plusy i minusy

Używanie ORM oszczędza dużo czasu, ponieważ:

  • SUCHY : model danych tylko w jednym miejscu i łatwiej jest aktualizować, utrzymywać i ponownie wykorzystywać kod.
  • Wiele rzeczy odbywa się automatycznie, od obsługi baz danych po I18N .
  • Zmusza cię do napisania MVC kodu , co w końcu sprawia, że ​​twój kod jest trochę czystszy.
  • Nie musisz pisać słabo sformułowanego SQL (większość programistów internetowych naprawdę się na niego dusi, ponieważ SQL jest traktowany jak język „podrzędny”, podczas gdy w rzeczywistości jest to bardzo wydajny i złożony język).
  • Odkażanie; korzystanie z przygotowanych wyciągów lub transakcji jest tak proste, jak wywołanie metody.

Korzystanie z biblioteki ORM jest bardziej elastyczne, ponieważ:

  • Pasuje do twojego naturalnego sposobu kodowania (to twój język!).
  • Wyodrębnia system DB, więc możesz go zmienić w dowolnym momencie.
  • Model jest słabo powiązany z resztą aplikacji, więc możesz go zmienić lub użyć gdziekolwiek indziej.
  • Pozwala korzystać z dobroci OOP, takich jak dziedziczenie danych, bez bólu głowy.

Ale ORM może być bólem:

  • Musisz się tego nauczyć, a biblioteki ORM nie są lekkimi narzędziami;
  • Musisz to skonfigurować. Taki sam problem.
  • Wydajność jest OK dla zwykłych zapytań, ale SQL Master zawsze lepiej radzi sobie z własnym SQL dla dużych projektów.
  • To abstrakty DB. Chociaż jest OK, jeśli wiesz, co dzieje się za sceną, jest to pułapka dla nowych programistów, którzy potrafią pisać bardzo chciwe wypowiedzi, jak ciężkie uderzenie w forpętlę.

Jak dowiedzieć się o ORM?

Cóż, użyj jednego. Niezależnie od tego, którą bibliotekę ORM wybierzesz, wszystkie one wykorzystują te same zasady. W okolicy jest wiele bibliotek ORM:

Jeśli chcesz wypróbować bibliotekę ORM w programowaniu internetowym, lepiej byłoby użyć całego stosu frameworka, takiego jak:

  • Symfony (PHP, używając Propela lub Doctrine).
  • Django (Python, przy użyciu wewnętrznego ORM).

Nie próbuj pisać własnych ORM, chyba że próbujesz się czegoś nauczyć. To gigantyczne dzieło, a stare wymagały dużo czasu i pracy, zanim stały się wiarygodne.

e-satis
źródło
50

Czy ktoś może dać mi krótkie wyjaśnienie ...

Pewnie.

ORM oznacza „Object to Relational Mapping”, gdzie

  • Część Object to ta, której używasz w swoim języku programowania (w tym przypadku python)

  • Część relacyjna to Relational Database Manager System (baza danych) Istnieją inne typy baz danych, ale najbardziej popularna jest relacyjna (znasz tabele, kolumny, pk fk itp. Np. Oracle MySQL, MS-SQL)

  • I wreszcie część Odwzorowanie to miejsce, w którym wykonujesz pomost między swoimi obiektami a stołami.

W aplikacjach, w których nie używasz frameworku ORM, robisz to ręcznie. Użycie frameworka ORM pozwoliłoby zredukować płytę kotłową potrzebną do stworzenia rozwiązania.

Powiedzmy, że masz ten obiekt.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

i stół

   create table employee(
          name varcar(10),
          -- etc  
    )

Użycie frameworka ORM pozwoliłoby na automatyczne zmapowanie tego obiektu za pomocą rekordu db i napisanie czegoś takiego:

   emp = Employee("Ryan")

   orm.save( emp )

I niech pracownik wstawi do DB.

Ups, to nie było takie krótkie, ale mam nadzieję, że wystarczy, aby złapać inne artykuły, które czytasz.

OscarRyz
źródło
17

ORM (Object Relational Mapper) to element / warstwa oprogramowania, które pomaga mapować obiekty kodu do bazy danych.

Niektóre obsługują więcej aspektów niż inne ... ale celem jest odebranie części ciężaru warstwy danych z barków programisty.

Oto krótki klip od Martina Fowlera (Data Mapper):

Wzorce mapowania danych architektury aplikacji korporacyjnych

Justin Niessner
źródło
4

Jak wszystkie akronimy, jest niejednoznaczny, ale zakładam, że mają na myśli mapowanie obiektowo-relacyjne - sposób na zakrycie oczu i uwierzenie, że pod spodem nie ma SQL, a raczej wszystkie obiekty ;-). Oczywiście niezupełnie prawda i nie bez problemów - zawsze kolorowy Jeff Atwood opisał ORM jako Wietnam CS ;-). Ale jeśli znasz mało SQL lub nie znasz go i masz dość prosty problem na małą skalę, mogą Ci zaoszczędzić czas! -)

Alex Martelli
źródło
2

Model obiektowy dotyczy trzech następujących pojęć Abstrakcja danych Dziedziczenie w enkapsulacji W modelu relacyjnym zastosowano podstawowe pojęcie relacji lub tabeli. Produkty mapowania obiektowo-relacyjnego (OR mapping) integrują możliwości języka programowania obiektowego z relacyjnymi bazami danych.

Hamza Riaz
źródło