goma smile Posted May 9, 2013 Report Share Posted May 9, 2013 (edited) Tātad tīri jūsu domas, kas ir labāks ORM vai Activerecord's. ja runa ir pa kādu framework ko aprunāt izmantojam lūdzu codeigniter vai kohana (Bet tas tā) Vieglums, parocība, atrdarbība utt... lietderība, gan lielām gan mazām datubāzēm, tabulām Edited May 9, 2013 by goma smile Quote Link to comment Share on other sites More sharing options...
F3llony Posted May 10, 2013 Report Share Posted May 10, 2013 Kas ir labāks - AK-47 vai zebra? AR un ORM ir divas dažādas lietas diviem dažādiem mērķiem. Quote Link to comment Share on other sites More sharing options...
codez Posted May 10, 2013 Report Share Posted May 10, 2013 (edited) ORM ir vispārējs jēdziens Objektu un relāciju(SQL) datubāžu datu mapošanai(nezinu kā šo pat iztulkot). Active Record būtībā ir ļoti vienkāršs ORM. Active Record patterns, ja tas tiek izmantots saistibā ar SQL datubāzēm, ir ORM. Active Record paterns sevī ietver būtībā 4 darbības: load, save, insert, delete. Tāpēc jautājums šeit vairāk būtu. Ja grib izmantot ORM, vai ar ActiveRecord piedāvādo funkcionalitāti parasti ir pietiekami? Teikšu tā: Laba Active Record bibliotēka apmierina 95% gadījumu. Bet jāsaprot, ka jebkura šāda lieta ir abstrakcijas slānis, kas paslēpj kādu daļu sarežģitības un tāpēc 5% gadījumu tik un tā nāksies atgriezties pie pamat SQL rakstīšanas. Tāpat jāsaprot, ka, ja tiek paslēpta daļa sarežģitības, tad prakstiski vienmēr AR bibliotēka darīs vairāk kā konkrētajā bridī nepieciešams. Taču parasti šīs liekās darbības atmaksājas pret vienkārsu un ātru developēšanu. Es personīgi savos PHP projektos izmantoju pašveidotu ActiveRecord bibliotēku, kura man +- nodrošina visu, ko vajag. Pašlaik esmu pārgājis uz Scalu un arī tur izveidoju sev patīkamu AR bibliotēku, papildinot to ar dažām interesantām funkcijām, kuras protams varētu izveidot arī PHP. Piemēram, AR objekta lauks var būt ne tikai int, string, float, utml, bet arī masīvs vai pat cits AR objekts, kā rezultātā dati ar json tiek serializēti. Šāda pieeja ir izdevīga, ja, piemēram, ir pietiekami kompleksi dati, kas attiecās tikai un vienīgi uz konkrēto ierakstu - tad tos saglabājot vai atlasot, nebūs jāveis vairāki lieki kveriji. PHP lielākā daļa ORM bibliotēku parasti ir veidotas AR paternā. PHP kā valodas dēļ, šeit pat īsti citu iespēju nav. Savukārt scalā esmu redzējis ari nedaudz citas pieejas. Tā kā scala ļauj sevī izveidot Domain Specific valodu un tā ir ari funkcionāla, tad ir iespējams panākt daudz "dabīgāka" ORM izveidošana. Piemēram: for { user <- Users if user.name == "John" } { for { comment <- user.comments if comment.created > now - 86400 } yield List(user.name, comment.text, comment. created) } šāda izteiksme uzģenerēs 1 kveriju: SELECT * FROM users u LEFT JOIN comments c ON u.id=c.userid WHERE u.name=="John" and c.created > 12345678 Bet kā iepriekš redzams, tas tika panākts nevis ar AR paternu, bet uzrakstot dubultos foreach ciklus stilā kādā būtībā tiek programmētas citas lietas scalā. Dotā izteiksme atgriezīs "2D masīvu" (listu no listiem) ar datiem. Šāda ORM DSL izveide PHP nav iespējama. Edited May 10, 2013 by codez Quote Link to comment Share on other sites More sharing options...
daGrevis Posted May 10, 2013 Report Share Posted May 10, 2013 Beidz veidot savus libus un turēt viņus tikai sev... :D Bet ja nopietni, paņem da jebkādu populāru ORM un lieto. PHP man ļoti patika Kohana ORM. Tagad izmantoju Django ORM. Es īsti neredzu atšķirību starp ORM kas seko AR un ORM, kas seko kaut kam citam. Kāds var mani apgaismot ar piemēriem (vēlams, vienā valodā)? Quote Link to comment Share on other sites More sharing options...
rpr Posted May 10, 2013 Report Share Posted May 10, 2013 Zebra ir labāka. Kas ir labāks - AK-47 vai zebra? AR un ORM ir divas dažādas lietas diviem dažādiem mērķiem. Quote Link to comment Share on other sites More sharing options...
spainis Posted May 10, 2013 Report Share Posted May 10, 2013 Beidz veidot savus libus un turēt viņus tikai sev... :D Bet ja nopietni, paņem da jebkādu populāru ORM un lieto. PHP man ļoti patika Kohana ORM. Tagad izmantoju Django ORM. Es īsti neredzu atšķirību starp ORM kas seko AR un ORM, kas seko kaut kam citam. Kāds var mani apgaismot ar piemēriem (vēlams, vienā valodā)? http://martinfowler.com/eaaCatalog/index.html - Data Source Architectural Patterns Quote Link to comment Share on other sites More sharing options...
daGrevis Posted May 10, 2013 Report Share Posted May 10, 2013 Paldies! Quote Link to comment Share on other sites More sharing options...
codez Posted May 10, 2013 Report Share Posted May 10, 2013 (edited) Beidz veidot savus libus un turēt viņus tikai sev... :D Security through obscurity. Es īsti neredzu atšķirību starp ORM kas seko AR un ORM, kas seko kaut kam citam. Kāds var mani apgaismot ar piemēriem (vēlams, vienā valodā)? AR paternā Objects satur gan datus, gan darbības to ielādei un saglabāšanai. AR piemērs: $user= new User(); $user->loadByPK(15); if ($user->isMale()) { $user["name"]="John Doe"; } $user->update(); Data Mapper (DM) paternā, objekts ir abstrakti dati un darbibas ar datiem, bet ne pati datu saglabāšana un ielāde - to veic mapper objekts. $usermapper = new UserMapper(); $user = $usermapper.loadByID(15) if ($user->isMale()){ $user["name"] = "John Doe"; } $usermapper.store($user); DM gadijumā $user objekts nav piesaistīts kaut kādai db vai datu persistances funkcionalitātei, bet ir pliks abstrakts lietotāja datu objekts ar kuru varētu, piemēram, veikt vēl citas darbības. Table Data Mapper ir vienkāršakais no veidiem (vienkāršakais tā realizācija no nulles, ne prakstiskā izmantošanā). Tajā objekts ir pliki dati un ir Tabulas klase, kura pārveido objekta datus kverijā, parasti ar 2 vai 3 funkcijām: find, update, insert, kuras parasti definē lietotājs, bet kaut kādas standartfunkcijas var būt definētas arī kopējā Table klasē. class UserTable extends Table{ function findById($id) { return db.query("SELECT * FROM users WHERE id=? LIMIT 1",$id)->row(); } //... } $user=UserTable.findById(15); //atgriež piemēram array("id"=>15, "name"=>"Bill", ... if (isMale($user)) { $user["name"]="Jonh Doe"; } UserTable.update($user) //Šijā gadījumā var pat vienkārši rakstīt: UserTable.insert(array("name"->"Jim","gender"->"Male")); Edited May 10, 2013 by codez Quote Link to comment Share on other sites More sharing options...
daGrevis Posted May 10, 2013 Report Share Posted May 10, 2013 Jep, tā arī es sapratu no spainis linka. Tad izskatās, ka DM ir labs veids kā mokot datubāzi iekš testiem. Quote Link to comment Share on other sites More sharing options...
101111 Posted May 10, 2013 Report Share Posted May 10, 2013 (edited) PHP lielākā daļa ORM bibliotēku parasti ir veidotas AR paternā. PHP kā valodas dēļ, šeit pat īsti citu iespēju nav. Plaši lietotā Doctrine2 implementē Data Mapper piegājienu, ko pats izklāstīji. Mazliet sarežģīta, bet kopumā laba biliotēka, iesaku tai uzmest aci katram, kas interesējas par ORM/DBAL izmantošanas iespējām. Edited May 10, 2013 by 101111 Quote Link to comment Share on other sites More sharing options...
codez Posted May 10, 2013 Report Share Posted May 10, 2013 (edited) Plaši lietotā Doctrine2 implementē Data Mapper piegājienu, ko pats izklāstīji.Jā, ar to teikumu es nedaudz pasteidzos. PHP var realizēt citus ORM veidus. Rakstot to teikumu, man prātā nāca tās dažas ORM bibliotēkas, kuras esmu redzējis scalā, kuras izmanto DSL. Edited May 10, 2013 by codez Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted May 14, 2013 Report Share Posted May 14, 2013 codez, Tu neesi no tiem programmētājiem, par kuriem Dienas Biznesā (vai kaut kur citur) bija raksts, ka čaļi nezināja Scala, bet ātri iemācījās? Quote Link to comment Share on other sites More sharing options...
Kavacky Posted May 15, 2013 Report Share Posted May 15, 2013 Es domāju, ka codez ir no tiem, kuri agrāk daudz ko nezināja, bet ātri iemācījās. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.