MVC Object Oriented Teknikleri - sorguları en aza indirmek ve esnekliğini korumak için nasıl?

3 Cevap php

PHP bir itiraz odaklı MVC framework (Kohana) kullanıyorum ve tür bir araya şeyler yapılması için birkaç teknikleri püresi var. Sorun ben çok ve sayfa başına sorgular bir sürü aramadan şeyler temiz tutmak için nasıl emin değilim değildir.

Benim örnek göstermek için, ben site gibi bir yığın taşması tasarlama hayal olacak:

Ben bir soru soru bulucu için (question_model) yanı sıra bir modeli sınıf (question_finder_model).

question_model çoğunlukla sadece soru verileri, cevap nesnelerin diziler ve bazı fabrika yöntemleri saklamak için değişkenleri içerir. Gibi bir şey:

class question_model {
    public $question_id,$question_title,$question_body,$answers = array();    
}

Soru bulucu kaplar question_model nesneleri bir dizi yanı sıra soru kimlikleri bir dizi. Kimlikleri dizisi sınıfında bulmak yöntemler ile doldurulur ve diğer yöntemler tarafından kullanılır. Gibi bir şey:

class question_finder_model {
    private $question_ids = array();
    public $questions = array() ;   //

    function public find_questions () {
        // executes some SQL to find a list of projects
        // Create a new question_model object for each question and store in $questions
        // for each of these questions store the id in $questions_ids
    }
    function public get_answer_info () {
       // using all the question ids stored in $question_ids:
       // find information about the answers
     }
}

Yani örneğin benim kullanıcı modeli soruları nesneleri bir dizi içerecektir, tüm modeller için bu yöntemi kullanın.

Sorun, işlemek için oldukça zor oluyor Örneğin benim soru çok cevap içerir ve her sorunun cevabı çok birçok yorum ve içerebilir olmasıdır. Nasıl birkaç sorguları kalmadan tüm bu nesneleri doldurabilirsiniz. Ben kolay yolu sadece soru nesneler benim dizi yineleme ve bu nesne için cevaplar bilgi alır soru sınıf içinde depolanan bir işlevi çağırmak olacaktır demek. Ama sonra 10 ya da sayfanın başına sorgu 100'ün çağırıyor olacak.

Sorun ifade etmek oldukça zor olduğu gibi bu tüm Abit puslu özür dilerim. Herhangi bir yardım perhpas benim tüm model kusurludur çünkü takdir olduğunu.

3 Cevap

What you are expressing here is one of the most common preoblems with naive ORMappers. Generating several queries.

Eğer sorunun kesin açıklamasını buradan okuyabilirsiniz: ORMs Done right: (DBA Gripe #3: hidden expensive actions)

Temelde sorun böyle bir şey için birkaç sorguları için gereken şudur:

foreach ($questions in $site) {
 foreach ($question as $questions) {
    foreach ($answer in $question){
       foreach ($comment in $answer) {
         echo "$site->title, $question->title, $answer->title, $comment->title";
       }
    }
 }

}

Bu gerçekten çok hızlı, çok yavaş olur.

What you need to do is to get all the info in one query with the proper Joins. And then populate your objects.

Class::ReluctantORM — mandatory prefetching: Bazı makalede önerilen uygulanması için arayın

Sonunda hang-up doğru her davayı almaya çalışırken alamadım. İlişkisel Model ve Nesne Modeli "empedans uyumsuzluğu" çözülmüş bir sorun değildir. Yani mükemmel kendiniz çözmeye çalışmayın. Sonuçta Object-Relational Mapping is the Vietnam of Computer Science

Bu gerçekten SQL daha PHP ile yapmak için bu kadar yok.

Yorum içeren bir soru için cevapların bir listesini almak için, soru id bütün cevaplar almak olabilir. Sonra, bir diziye tüm cevap kimliklerini toplamak, ve o dizi bir cevap kimliğe sahip tüm yorumları getir.

Bu üç sorgularının. Böylece size cevap id sıralama yorumlar ise daha hızlı yapılabilir, ve - sadece comment hangi kod cevap ait hangi çalışmak gerekiyordu.

Ayrıca oldukça güzel şeyleri hızlandırmak gerektiğini, hangi dosyaları veya diğer, memcached şeyler önbelleğe alabilir.

Tabii ki bu tür yapılardan nesneleri binanın sadece sorgu başına daha yanıltıcıdır, ama bu sadece yapmanız gerekir şey olabilir.

Jani Hartikainen oldukça iyi özetledi, ben başka bir şey belirtmek istiyorum.

When you have learned OOP, everything starts to look like an object.

Her şeyin bir sınıf olarak ilan etti ve bir nesne olarak görülebilir doğru olsa da, bunu yapmak zorunda değilsiniz. Sizin örnekte, oldukça bireysel bir soru / cevap / yorum nesneler ile ilgili daha geniş bir veri manipülasyon olarak görülebilir belki daha kolaydır.

O açıdan bakmak sonra, muhtemelen Jani adlı kendiniz gibi çözümleri ile gelecek.