Czym dokładnie jest Arel w Railsach 3.0?


86

Rozumiem, że jest to zamiennik dla ActiveRecord i używa obiektów zamiast zapytań.

Ale...

dlaczego tak jest lepiej

czy obiekty / zapytania będą „łatwiejsze” do tworzenia?

czy doprowadzi to do wydajniejszych zapytań SQL?

czy będzie kompatybilny ze wszystkimi głównymi bazami danych? - Zakładam, że tak.

czy korzystanie z procedur przechowywanych będzie łatwiejsze / trudniejsze?

Odpowiedzi:


182

Czym dokładnie jest Arel w Railsach 3.0?

Jest to model obiektowy dla algebry relacyjnych operatorów zapytań.

Rozumiem, że jest to zamiennik ActiveRecord

Nie, nie jest. Jest to zamiennik ręcznego tworzenia zapytań SQL w łańcuchach. Jest to typowa warstwa zapytań, która leży u podstaw ActiveRecord, ale może być również używana na przykład jako podstawa dla DataMapper.

Jeśli coś zastępuje, zastępuje Ambition. Możesz też myśleć o tym jako o wersji Ruby standardowych operatorów zapytań LINQ lub SQLAlchemy języka Python. (W rzeczywistości autor jawnie cytuje zarówno LINQ, jak i SQLAlchemy jako inspirację).

Lub możesz zobaczyć to jako zamiennik named_scopes. W rzeczywistości ARel jest w dużej mierze urzeczywistnieniem idei, że „każde zapytanie jest named_scope”. No i co wiesz: oba zostały napisane przez tego samego faceta.

i że używa obiektów zamiast zapytań.

Nie, używa obiektów jako zapytań.

dlaczego tak jest lepiej

Ruby jest językiem zorientowanym obiektowo, a nie ze zorientowanym na łańcuchy. Z tego powodu sam , ma sens do reprezentowania zapytań jako obiekty zamiast strun. Zbudowanie odpowiedniego modelu obiektowego dla zapytań zamiast używania łańcuchów do wszystkiego daje prawie takie same korzyści, jakie daje zbudowanie odpowiedniego modelu obiektowego dla systemu księgowego zamiast używania łańcuchów do wszystkiego.

Kolejną dużą zaletą jest to, że ARel implementuje rzeczywistą algebrę operatorów zapytań. Innymi słowy, ARel wie o matematycznych zasadach konstruowania i komponowania zapytań. Jeśli połączysz dwa ciągi, z których każdy zawiera prawidłowe zapytanie SQL, wynikiem prawdopodobnie nie będzie prawidłowe zapytanie SQL. Lub, co gorsza, jest to prawidłowe zapytanie SQL, ale takie, które nie ma sensu lub robi coś zupełnie innego niż myślisz, że robi. To nigdy się nie zdarzy w przypadku ARel. (To właśnie oznacza artykuł, do którego odsyłam poniżej, jako „zamknięty w kompozycji”).

czy obiekty / zapytania będą „łatwiejsze” do tworzenia?

Tak. Na przykład, jak wspomniałem powyżej, znacznie łatwiej jest tworzyć bardziej złożone zapytania z prostszych części.

czy doprowadzi to do wydajniejszych zapytań SQL?

Tak. Fakt, że ARel ma odpowiedni model obiektowy dla zapytań, oznacza, że ​​może przeprowadzać optymalizacje tych zapytań na długo przed wygenerowaniem rzeczywistego zapytania SQL.

czy będzie kompatybilny ze wszystkimi głównymi bazami danych? - Zakładam, że tak.

Tak. W rzeczywistości zawsze mówiłem o SQL powyżej, ale w rzeczywistości relacyjna algebra zapytań może generować zapytania dla prawie wszystkiego. Ponownie zobacz LINQ lub Ambition jako przykłady: oba mogą wykonywać zapytania SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… wszystkie z tą samą składnią.

Być może najlepszą dyskusją na temat tego, czym jest ARel i dlaczego napisał Nick Kallen, jest trafnie nazwany artykuł Why Arel? przez samego Nicka Kallena . Uwaga: artykuł zawiera łagodny żargon matematyczny i informatyczny, ale o to właśnie chodzi: ARel ma mocne podstawy w matematyce i informatyce, to właśnie te podstawy nadają mu potężne właściwości.


Doskonała odpowiedź. Przeczytałem zamieszczony przez Ciebie link i przeważnie go śledziłem. W rzeczywistości część comp sci miała sens, ale to, w jaki sposób została włączona do szyn, było przyczyną problemów. Dla mnie o wiele bardziej sensowne jest to, że zastępuje ręcznie spreparowany SQL (lub cokolwiek innego), a tym samym AR jest na nim zbudowany w 3.0. Dostawałem różne wrażenia dla ludzi, którzy powinni wiedzieć lepiej, a ta odpowiedź jest genialna w prostym i precyzyjnym wyjaśnieniu każdego z powyższych pytań.
Will

Mam jedno dodatkowe pytanie. Wspomniałeś wyżej o LDAP, AMZ itp. Zakładam, że obecnie (bazując na rails / arel na githubie) ARel nie ma takiej możliwości, tylko potencjał? tj. dopóki ktoś nie wdroży tej części. Brzmi to jednak bardzo ekscytująco.
Będzie

2
@Will - myślę, że będziesz musiał poczekać, aż ktoś rozwinie te fajniejsze możliwości. Lub spróbuj samemu, jeśli będziesz tego potrzebować?
Mike Woodhouse

1
+1, chociaż link jest martwy; naiwne wyszukiwanie nie znalazło aktualnego linku.
Dave Newton,

@DaveNewton: Najwyraźniej zniknął. Wokół krąży
Jörg W Mittag

19

ARel jest niestety bezpośrednio powiązany z generowaniem kodu SQL i dlatego jest nieodpowiedni dla potrzeb DataMapper.

Sposób, w jaki bym to określił, jest taki, że ARel jest jawnym modelem zapytań dla ActiveRecord, który generuje i optymalizuje zapytania SQL dla RDBMS.

Z drugiej strony DataMapper jest prawdziwym maperem danych i może już współpracować z nierelacyjnymi magazynami danych. W przyszłości DataMapper prawdopodobnie będzie zawierał oddzielną bibliotekę o nazwie Veritas, która ma zapewnić funkcje relacyjne dla danych pochodzących z DOWOLNEGO magazynu danych, a nie tylko systemów RDBMS.


2
Dlaczego to otrzymało -1?
Jeriko

10
Jestem opiekunem DataMappera i to, co mówi teoria wiedzy, jest prawdą. ARel, w obecnej implementacji, nie może być używany pod DataMapper, ponieważ zapewnia tylko podzbiór funkcji potrzebnych do pracy z ponad 40 magazynami danych obsługiwanymi przez DM. IMHO obecna implementacja jest ściśle powiązana z generowaniem kodu SQL, a naprawienie interfejsu API / elementów wewnętrznych do pracy z magazynami danych zasadniczo różniącymi się od RDBMS zajmie dużo pracy. ARel jest krokiem naprzód, ale obecnie nie może stanowić podstawy dla czegoś więcej niż ActiveRecord.
dkubb

1

Arel w Railsach 3 tworzy obiekty relacji, w których baza danych nie jest odpytywana, dopóki jej nie potrzebujesz. Dużo bardziej wydajne.

Jest też bardziej naturalny (kiedy już się do tego przyzwyczaisz), co jest naprawdę wielką zaletą Railsów.


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.