Aktív rekord minta
Az aktív rekord egy programtervezési minta relációs adatbázisokat használó programok számára. Először Martin Fowler írt róla 2003-ban megjelent könyvében, a Patterns of Enterprise Application Architecture-ben.[1] A minta szerint az adat objektumok interfésze adatbázist kezelő műveleteket tartalmaz, mint beszúrás (insert), frissítés (update) és törlés (delete). Tulajdonságai megfelelnek az adat táblájának oszlopainak.
Az adatbázis táblákat és nézeteket a minta erőforrás objektumokba ágyazza. Az objektumot létrehozáskor hozzáadja a táblához. Betöltéskor az adat objektumok információjukat az adatbázisból nyerik. Frissítéskor szintén frissítődik az adatbázis megfelelő sora. Az erőforrás osztály minden tulajdonsághoz tartalmazza a hozzáférési metódusokat.
A mintát gyakran használják objektum perzisztencia eszközökben és objektum-relációs leképzésekben (ORM). Tipikusan az idegen kulcs kapcsolatokat a megfelelő típus objektumpéldányaként egy tulajdonságnak megfelelően.
Megvalósításai
[szerkesztés]Az aktív rekord megvalósításai több programozási nyelvhez és több keretrendszerben elérhetők. Például, ha van egy parts tábla string típusú name és price oszlopokkal, akkor az aktív rekord implementálása a Parts osztályban lehetővé teszi, hogy egy Part objektumot létrehozzanak, és beszúrjanak a táblába ezzel a pszeudokóddal:
part = new Part() part.name = "Sample part" part.price = 123.45 part.save()
ami megfelel a következő SQL parancsnak:
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);
A lekérdezés pszeudokódja:
b = Part.find_first("name", "gearbox")
aminek SQL megfelelője ilyen, vagy hasonló:
SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; -- MySQL vagy PostgreSQL
Ez megtalálja az első Part objektumot, aminek name oszlopában a "gearbox" érték található.
ColdFusion
[szerkesztés]A ColdFusion az aktív rekord egy nyílt forrású megvalósítása. Erre épül a szintén nyílt forrású ColdFusion on Wheels keretrendszer, ami nem igényel bonyolult beállításokat.
PHP
[szerkesztés]A PHP ActiveRecord nyílt forrású könyvtár, amit az aktív rekord használatához terveztek.[2]
Több nyílt keretrendszer hozza magával a saját ORM implementációját az aktív rekord mintára. A legtöbb támogatja a kapcsolatokat, viselkedést, validációt, szerializációt és több adatbázis egyidejű használatát.
- A Maghead egy nagy teljesítményű adatbázis keretrendszer, amit teljes mértékben PHP-ban írtak. Tartalmaz egy osztály/kérés generátort a gyorsabb kiszolgálás érdekében. Keveri az aktív mintát a tárhely mintával.
- A Boiler egy MVC keretrendszer, ami eszközkészletet tartalmaz az aktív rekord modellek automatikus generálására.[3] Adatközpontú projektekhez tervezték, és célja, hogy annyira automatizálja a fejlesztést, amennyire csak lehetséges az Apache Ant felhasználásával.[4] Habár új a nyílt forrású piacon,[5] több aktív projekt is használja, mind ingyenes és nyílt, mind kereskedelmi szoftverek. A keretrendszer jelenleg csak a MySQL-t használja, habár egyes kereskedelmi termékek azt állítják, hogy Postgresszel működnek.
- A Cygnite PHP keretrendszer alapértelmezett adatbázis rétege tartalmaz aktív rekord mintát, ami a Ruby on Railsre emlékeztet.[6]
- A Laravelben Eloquent nevű ORM-ja megvalósítja az aktív rekord mintát, és a Ruby on Railsre hasonlít.[7]
- A CakePHP ORM-ja aktív rekord mintát használ,[8] de a 2.x verziók adattömböket adnak vissza, amelyek tartalmazzák a kapcsolódó adatok szintjét is. A 3.0 verzió objektumokat használ.
- A Lithium ORM-ja aktív rekord mintával működik.
- További példák a Yii ORM-ja,[9] a Propel[10] és a Paris. A Paris a PHP5 számára készült könnyű súlyú megvalósítás, ami az Idiormra épül.[11]
Nem aktív rekordot, de valami hasonlót tartalmaznak:
- A Symfony alapértelmezett Doctrine adatbázis rétege és ORM-ja adatleképező megközelítést használ.
- A CodeIgniterben van ActiveRecord kérésépítő, de ez az aktív rekord módosítását valósítja meg. Elérhető a CodeIgniter DataMapper könyvtárával vagy a CodeIgniter Gas ORM könyvtárral.
Python
[szerkesztés]A Django egyike a sok Pythonhoz készült webfejlesztési keretrendszernek. Az aktív rekord mintát használja az ORM-hoz.[12]
Ruby
[szerkesztés]A Ruby ActiveRecord ORM-ja perzisztálható tartomány modellt használ az üzleti objektumokhoz és adatbázis táblákhoz, ami a logikát és az adatokat egy csomagban tartalmazza. Az ActiveRecord bővíti a mintát örökléssel és asszociációval, így feloldva a minta két lényegi korlátját. Makrói tartományspecifikus nyelvet valósítanak meg, és egytáblás rendszert integráltak bele. Ezekkel a bővítésekkel az ActiveRecord majdnem eléri az adatbázis interakció teljes funkcionalitását. A Ruby on Rails alapértelmezett modellje az aktív rekord a modell-nézet-vezérlő mintában. További Ruby alkalmazások számára önálló ORM csomag is készült. Kezdeményezője David Heinemeier Hansson, akihez számosan csatlakoztak.[13]
Emellett megjelentek más ORM-ok is, mint a DataMapper és a Sequel, amelyek az ActiveRecord továbbfejlesztései. A Ruby on Rails v3.0 közösségének javaslatára önálló ORM használatára tért át, így a felhasználók cserélhetik alatta az ORM-ot.
Java
[szerkesztés]A Java számára az ActiveJDBC tartalmazza az aktív rekord mintát. Az ActiveJDBC a Ruby on Rails ActiveRecord mintájára készült. Kicsi, könnyű súlyú, gyors, konfigurációt nem igényel.
További implementációk az ActiveJPA és a jOOQ (Java Object Oriented Querying). Kombináljűk az aktív rekord mintát a kódgenerálással, és egy SQL-hez hasonló DSL-t, ami lehetővé teszi az SQL használatát is, ha arra van szükség.
A Play Framework webes keretrendszer, ami a Ruby On Rails ötlete alapján valósítja meg az aktív rekord mintát.
A JActiveRecord egy további Ruby on Rails ActiveRecordja által inspirált megvalósítás, ami azonban súlyt helyez a Java típusbiztosságra.
Dart
[szerkesztés]A Dart számára az Dartabase Migration és a Dartabase Model csomagok érhetők el.
A Dartabase Migration Serverside Database Object Models egyszerű adatkezelést tesz lehetővé, ami a MySQL/PGSQL nyelveket támogatja a Ruby on Rails Migration alapján.
A Dartabase Model Serverside Database egyszerű, verziókontrollt megvalósító adatbázisszerkezet manipulátor, ami szintén a Ruby on Rails mintájára készült, és támogatja a MySQL/PGSQL nyelveket.
További nyelvek
[szerkesztés]Más nyelvek számára is léteznek nyílt aktív rekord implementációk, köztük a JavaScript (például ActiveJS Active Record[14]), Perl (DBIx::Class), ActionScript, Haxe (SPOD[15]), C#,[16] Objective-C[17] és Scala számára.[18]
Kritika
[szerkesztés]Az aktív rekord minta programlogikája megnehezíti teszteléskor az adatbázis mellőzését. Ez megoldható mókolással vagy dependency injectionnel, amelyek lehetővé teszik az adatbázis tier adatainak szimulálását.
Egy másik kritika az adatbázis és a programlogika szoros összekapcsolását illeti. Itt az objektumok nem követik a felelősségmegosztás elvét, ami pedig a réteges szerkezet egyik alapelve. Éppen emiatt csak kis méretű alkalmazások használják, vagy egy nagyobb architektúra részeként valósítják meg, az adatbázissal közvetlenül kommunikáló tierben. Több ORM rendszer is így tartalmazza az architektúrát.
Jegyzetek
[szerkesztés]- ↑ Fowler, Martin. Patterns of enterprise application architecture. Addison-Wesley (2003). ISBN 978-0-321-12742-6
- ↑ PHP ActiveRecord. [2010. február 8-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ Boiler Documentation: Models. [2017. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ YouTube demonstration of automation tools
- ↑ Open Source Code, hosted on Github
- ↑ Cygnite Framework Documentation: Active Record. [2017. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ Laravel Documentation: Eloquent ORM. [2014. szeptember 22-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ CakePHP (most popular PHP framework). Stanford University Wiki. [2017. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ The Definitive Guide to Yii: Active Record. [2017. augusztus 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ Propel: Active Record Reference. [2017. augusztus 13-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 14.)
- ↑ Github: j4mie/paris
- ↑ Django modellek. [2017. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 16.)
- ↑ Ruby Active Record. (Hozzáférés: 2013. április 12.)
- ↑ ActiveJS Active Record. [2011. szeptember 30-i dátummal az eredetiből archiválva]. (Hozzáférés: 2011. július 28.)
- ↑ SPOD Macros. [2012. november 30-i dátummal az eredetiből archiválva]. (Hozzáférés: 2013. január 9.)
- ↑ Castle ActiveRecord. [2017. július 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. január 14.)
- ↑ Objective Record. (Hozzáférés: 2013. január 14.)
- ↑ Scala Active Record. (Hozzáférés: 2013. december 4.)
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben az Active record pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.