Bir ORM, AR, QB, ve arasındaki fark nedir

3 Cevap php

Tamam, böylece herkes karar verdi (ve iyi bir nedenle) boğaz SQL şeytanın olduğunu. Bu veritabanından bizim kodunu ayırmak için bizim kodu bir "orta-adam" yerleştirerek birçok yöntem ile bize bırakır. Şimdi ben umut birisi toplanan tüm bilgi boğaz bana ayarlamak ve ben yerleşik bana ne söyleyebilir tükürmek için gidiyorum.

Bir ORM (Object-ilişkisel eşleme) uygulamasında nesnelere veritabanı satır eşleyen bir dizi araç (gevşek veya sıkı entegre bağlıdır) 'dir.

Bir AR (Active-Record) bir veritabanı tablo veya görünümü, bir sınıf içine sarılmış ve böylece bir nesne örneği tabloda tek bir satıra bağlı olduğu ORM bir türüdür.

Veri haritalama (DM), iki farklı veri modelleri arasında veri elemanı eşlemeleri oluşturma işlemidir ORM bir türüdür.

Bu gibi çalışmak için her üç iddia:

$user = new User();
$user->name = 'Fred';
$user->save();

Genellikle böyle bir kullanıcı sınıfı şey:

class User extends Model {
    // Specify the database table
    protected $table = "users";

    // Define your fields
    protected $fields = array(
    	'id' => array('type' => 'int', 'primary' => true),
    	'name' => array('type' => 'string', 'required' => true),
    	'email' => array('type' => 'text', 'required' => true)
    );
}

Bu kurulum ile kolayca SQL yazmaya gerek kalmadan satırları getirebilir.

// users
$users = $user->fetch(array('id' => 3));

Bazı AR sınıflar aslında buna benziyor:

$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');

O kıllı alır nerede Tamam, şimdi bu. Herkes ve kardeşi nerede düşüyor ne tür kodun farklı bir görünümü var gibi görünüyor. Çoğu bir AR veya DM ORM bir tür olduğunu kabul ederken - ama bazen DM yıllardan itibaren AR adlı söylemek hatları smear gibi görünüyor.

Ben bu nesneye çağrı yapmak ve sonuç tasarrufu / getiriliyor SQL oluşturulmasını işleyen tek bir nesneyi ($ db) kullanan bir sınıf yazdım.

//Fetch the users
$results = $db->select('id, name')->where('id > 4')->get('users');

//Set them active
while($user = $results->fetch()) {
    $user->active = TRUE;
    $user->save();
}

Yani soru "? Nedir" olduğunu, ve neden insanlar bu şartlar yok ediyorsunuz?

3 Cevap

Sen belki de make up the acronyms ORM, hepsi sadece state başka bir ortama aktarıldı ve fonksiyon / semantik sarılır ne olursa olsun ... RM DM.

Sun Microsystems ve Microsoft Java ve C # ile bunu her zaman yapmak. Basit bir şey almak ve ona yeni bir ad verelim! Ne harika bir fikir.

ORM derseniz .. herkes onun farklı kisveler altında, ne olduğunu bilir. Sizin kod olsa Linq şeyler gibi görünüyor.

Hiçbir büyü, ama kodlardan ve yaygara IMHO sürü.

O düz SQL şeytan değil - bazen hemen hemen siz istediğiniz şekilde gerçekleştirmek için bir sorgu almak için ham SQL yazmak gerekirdi. Benim için, Orms (pahasına SQL kaçınma gibi) başka bir şey daha el işi ortadan hakkında çok daha fazladır. Ben sadece kurulum için tüm kod, her proje için tüm el yapımı sorgu ile nesneleri olmasını istemiyorum. Bu çalışma ve düşünce sadece bir gülünç miktarda bulunuyor. Bunun yerine, ORM araçları yoksa manuel bir sürü iş gerekli olurdu veri nesneleri oluşturmak için güzel ve otomatik bir yol sağlar. Şimdi ben düşünmeden, için özel fonksiyonlarını uzatmak ve oluşturabilirsiniz otomatik tek satır nesneler olabilir. Ben bu sorguyu-kodu el kalmadan farklı tablo ilgili satırları alabilirsiniz.

Bu kullanıcı sınıfı örneği phpDataMapper adlı gibi görünüyor, ve eğer öyleyse sen gibi tablo yapıları için bir SQL dosya dağıtmak zorunda kalmazsınız, aynı zamanda dahili otomatik tablo göçler gibi incelikler diğer bazı vardır iyi bir kaç yardımcı fonksiyonları ve diğer şeyler gibi. O ana hedefi var - tüm özellikleri size zaman kazanmak için tasarlanmıştır dahil.

$ User-> save () - - "Record", "aktif AR ve DM arasındaki en önemli ayrım, bir ActiveRecord (AR) satırında kendi verileri mağaza bilir ve böylece her satır nesne üzerinde güncelleme fonksiyonlarını kaydetme / olmasıdır ". DataMapper (DM) ile, diğer taraftan, her satır tanımına göre, bu kendi veri deposuna bilmiyor. Satır sizin kodu ile çalışmış olabilir aptal bir değer nesnesi daha fazladır. $ Mapper-> ($ kullanıcı) tasarruf - mapper geri datastore'una o satıra değişiklikleri tercüme sorumludur. İşte en önemli fark - Eğer çekirdek ORM özelliklerin çoğu hemen hemen her uygulamada aynı bulacaksınız. Bu sadece çoğunlukla çekirdek mimari düzeyde bir araya koymak nasıl bir meselesi.

Aiden Bell @ ile anlaştı. Ama farklılıkları işaret doğru olduğunu düşünüyorum. Ben senin tanımı sadece ORM Aktif-Record tarzı olan SQL için LINQ kullanın. Ben sıfırdan apps bir sürü üzerinde çalışmak ve benim sınıfları oluşturmaktır db başlamak gibi benim için bu harika çalışıyor. Oradan bir Domain Driven Design yaklaşımı (biliyorum ... Bu sınıflar ilk konsept) benim oluşturulan sınıflar ile çalışan takip etmek eğilimindedir. Bana göre bu hızla yolda beni alır.

Ben de Entity Framework ve NHybernate ile çalıştım bu söyledikten sonra. Entity Framework UBER veri mapper ve NHybernate ayrıca bir veri mapper ama çok karmaşıklığı olmadan! Ben şahsen Varlık Framework gitmek için uzun bir yol olduğunu hissediyorum. Böyle db oldukça taş kuruldu bir brownfield uygulamasında olduğu gibi daha fazla karmaşıklık ihtiyacı hiç oldu ve ben oldukça benim veritabanına daha benim uygulamayı temsil etmek benim sınıfları almak için gerekirse o zaman çizgisinde daha fazla bir şey taşımak için tercih ediyorum NHybernate ve veri haritalama funcationality.

Ben bu araçların her biri bu yer olduğunu düşünüyorum. Bu, onlar değil gibi hepsi aynı olduğunu söylemek adil değil. Doğrudan benim veritabanı temsil eden benim için sınıfları oluşturduğu aktif bir rekor harika. Ben veritabanı oluşturulduğunda veya veritabanı yakından benim her yerde hüküm ve uygulama kavramlarını temsil ettiği zaman bu işleri. Ben bir haritalama özellikleri yoluyla zengin bir etki alanı oluşturmak için benim veritabanında orada karmaşıklığı ya da eksikliği saklanması hangi durumda mantıklı veya açıkça benim uygulama eşleşmiyor sabit bir db varsa ORMs haritalama türleri çalışmak ORM aracı.