Jump to content
php.lv forumi

ORM VS ACTIVERECORD


goma smile

Recommended Posts

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 by goma smile
Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

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ā)?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

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 by 101111
Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...