2009-09-10 23 views
10

Piszę z CodeIgniter i po raz pierwszy natknąłem się na Active Records. Na początku odrzuciłem to jako coś dla ludzi, którzy tak naprawdę nie wiedzą jak pisać SQL. Teraz zdaję sobie sprawę, że moja analiza była błędna i Active Records są dość widoczne, szczególnie w Rails.Jaki jest cel Active Records?

W jakim celu są przechowywane Aktywne rekordy? Czy to abstrakcja od różnych indywidualizacji RDBMS. Jeśli tak, to pomyślałem, że to nie jest to, co SQL ma robić. Co jest najlepszą praktyką, czy powinienem ich używać?

góry dzięki

Odpowiedz

5

W „Active Record Wzór” staje się podstawowym elementem większości ram programowych. Ułatwia to szybsze wykonywanie zadań CRUD (tworzenie, aktualizowanie, czytanie, usuwanie). Na przykład zamiast pisać wiele instrukcji SQL do wstawiania, aktualizowania i usuwania wielu wspólnych i prostych obiektów danych, można po prostu przypisać wartości do obiektu danych i uruchomić polecenie, np. $ object-> save(), SQL jest skompilowany i wykonany dla ciebie.

Większość frameworków również implementuje relacje danych w obrębie ich odpowiednich modeli rekordów aktywnych, co może znacznie uprościć dostęp do danych związanych z obiektem. Na przykład w CodeIgniter, jeśli określono, że kategoria "ma wiele" produktów, to po załadowaniu obiektu kategorii z bazy danych można wyświetlić listę produktów potomnych z prostym wierszem kodu.

foreach ($category->products as $product) { 
    echo $product->name; 
} 

Inną korzyścią z Active Record jest, jak mówisz, że to sprawia, że ​​Twój kod łatwo przenośne na różnych platformach bazodanowych (tak długo, jak ramy, które używasz ma sterownik dla wybranej bazy danych), a mimo to prawdopodobnie nie wyda się to teraz ważne, to moja ma większą wartość w późniejszym terminie, jeśli twoja aplikacja stanie się popularna!

Mam nadzieję, że to pomogło. Wikipedia opisuje dobrze rekord aktywności (http://en.wikipedia.org/wiki/Active_record_pattern), a także dokumenty CodeIgniter. Osobiście używam KohanaPHP (http://www.kohanaphp.com), który jest tylko widelcem CodeIgniter w PHP5 i uważam, że to modele ORM są bardzo przydatne!

8

Active Record jest wzorzec projektowania dla dostępu do danych ...

Obecnie istnieją dwa główne wzorce projektowe wydaje mi się natknąć w sprawie dostępu do danych: ActiveRecord a Repository wzorek

Active Record

Twoje obiekty zawierają metody utrzymującego swój stan do DB (lub inny mechanizm wytrwałość) tak:

Być może obiekt klienta.

Obiekt klienta będzie miał kilka metod takich jak Customer.Save() ;, Customer.Get (int id); i inni.

Te metody nie mają nic wspólnego z klientem w realnym świecie. Chodzi w rzeczywistości o infrastrukturę twojej aplikacji.

Repository Wzór

repozytorium wzór Twój obiekt klient byłby POCO lub niemy przedmiot. Ma tylko metody i właściwości, że naprawdę potrzebuje do reprezentowania klienta (rzeczy takie jak nazwisko, adres e-mail, listy zamówień, etc.)

Gdy chcesz utrzymywać klienta - wystarczy przekazać je do repozytorium

Repository.Save (MyCustomer).

Aktywny wzór rekordu jest szybki i łatwy w użyciu. Niestety, nie zaśmieca twojego modelu domeny tymi metodami, które tak naprawdę nie mają nic wspólnego z klientem. To sprawia, że ​​nieco trudniej jest utrzymać swój model domeny w czasie.

Dla wielu sytuacji bardzo dobrym rozwiązaniem jest użycie aktywnego wzoru rekordu. Na przykład - jeśli piszę dość prostą aplikację, która prawdopodobnie nie zmieni się zbytnio, prawdopodobnie wystrzeliłbym SubSonic i wygenerowałbym aktywny DAL. Będę kodował mój kod biznesowy w ciągu 20 minut, a wszystkie sprawy DB zostaną już załatwione.

Jeśli, z drugiej strony, jestem modelowania szczególnie zespolonej, o wysokiej podatności na zmiany, wolałbym zachować moje model domeny czyste i wdrożyć repozytorium wzór z NHibernate lub podobnym ...

Minęło dużo czasu odkąd zastosowałem własny dostęp do danych za pomocą ADO.Net i naprawdę nie polecam go, ponieważ jest dostępnych tak wiele świetnych narzędzi dostępu do danych.

+0

+1. Bardzo dobre wyjaśnienie –

0

Aktywny rekord to ORM - czy zapoznałeś się z techniką mapowania powiązań obiektów? Myślę, że jeśli zrozumiesz ORM, zaczniesz dostrzegać korzyści.

+0

Istnieją ORM, które mają "Aktywny rekord" w nazwie, ale Rekord Aktywny jest bardziej poprawnie wzorzec projektowania aplikacji korporacyjnych. Zapoznaj się z książką Martina Fowlera w mojej odpowiedzi, jest to świetna książka do oczyszczenia tych rzeczy. – Ash

+0

Cześć Ash, dzięki za to - weźmiemy ... – JonB

2

Mogę wyrazić własny pogląd na ten wzór, ale najlepszym obszarem działania Active Record (i wielu innych) jest Patterns of Enterprise Application Architecture autorstwa Martina Fowlera.

z rozdziału 10:

Active Record

Obiekt, który zawija wiersz w tabeli bazy danych lub widoku, obudowuje dostęp do bazy danych i dodaje do Domena logiki na tych danych.

Obiekt przenosi zarówno dane, jak i zachowanie . Duża część tych danych jest trwała i musi być przechowywana w bazie danych . Rekord aktywny wykorzystuje najbardziej oczywiste podejście polegające na wpisaniu danych do logu w obiekcie domeny. W ten sposób wszyscy ludzie wiedzą, jak odczytywać i zapisywać swoje dane do iz bazy danych.

...

kiedy go używać

Active Record jest dobrym wyborem dla logiki domeny, który nie jest zbyt złożone, takie jak tworzy, czyta, aktualizacje i usuwa. Derywacja i sprawdzanie poprawności na podstawie jednego rekordu sprawdzają się w tej strukturze.

...

Active Record ma podstawową zaletę prostoty. Łatwo jest uzyskać budować Active Records, a one są łatwe do zrozumienia. Ich głównym problemem jest to, że działają dobrze tylko wtedy, gdy obiekty rekordu aktywnego odpowiadają bezpośrednio tabelom bazy danych: izomorficzny schemat .

Jeśli logika biznesowa jest złożona, wkrótce chcą wykorzystywać bezpośrednie relacje Twojego obiektu, zbiory, dziedziczenia, i tak dalej. Nie są one łatwo mapowane na Active Record, a dodawanie ich fragmentarycznie staje się bardzo niechlujne. To, co doprowadzi do korzystania z danych Mapper zamiast

1

Jeśli cokolwiek, ułatwia pisanie zapytań. Uważam, że normalna składnia MySQL jest podatna na błędy składniowe (brak błędu, ale moja własna) i ze składnią rekordów aktywnych CI rzadko mi się to przydarza.

Aktywny rekord jest jedną z najfajniejszych funkcji CI IMHO