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ć?


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.


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.



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! -)


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.