Rýchlosť fungovania aplikácie
- ricco24
- Člen | 141
Chcem sa spýtať ktoré z nasledovných riešení je prijatelnejšie na výkon aplikácie.
Povedzme že tabuľka project má 1000 záznamov. Tabuľka project_institute ktorá drží záznami o jednotlivých inštitútoch podielajúcich sa na projekte (m x n tabuľka) má vyše 3000 záznamov.
Prvé riešenie
Využívanie len db dotazov.
public function getInstituteData($id) {
//1 db dotaz
$institute = $this->db->table('institute')->where('id', $id)->fetch();
//počet dotazov na databázu - podľa počtu inštitútov
foreach($institute->related('project_institute')->where('institute.id', $institute->id) as $project_institute) {
$project[] = $this->getProjectData($project_institute->project->id);
}
}
public function getProjectData($id) {
//1 db dotaz
$project = $this->db->table('project')->where('id', $id)->fetch();
//počet dotazov na db - počet inštitútov x počet related záznamov ...
foreach($project->related('institute_project') as $project_institute) {
//ďalší kód
}
}
Druhé riešenie
Využívanie polí na iteráciu.
public function getInstituteData($id) {
$institute = $this->db->table('institute')->where('id', $id)->fetch();
//vytiahnem si celé tabuľky do pola cez ktoré potom iterujem
$this->projects = $this->makeArray($this->db->table('project'));
$this->project_institutes = $this->makeArray($this->db->table('project_institute'));
foreach($institute->related('project_institute')->where('institute.id', $institute->id) as $project_institute) {
$project[] = $this->getProjectData($project_institute->project->id);
}
}
public function getProjectData($id) {
foreach($this->projects as $p) {
if($p['id'] == $id) {
$project = $p;
}
}
foreach($this->project_institutes as $project_institute) {
//ďalší kód
}
}
Takže v prvom riešení sa vždy pri vyťahovaní projektu dotazujem na databázu čo určite nieje správne keďže tam tých projektov môže byť naozaj veľa. No v druhom riešení vyťahujem jedným dotazom tabuľku do premennej ktorú potom prevediem do poľa cez ktoré iterujem.
Ktoré riešienie je lepšie ? Poprípade ak sa vám nepozdáva ani jedno, ako by ste to riešili vy ?
- Jan Endel
- Člen | 1016
Výkonnost jednotlivých řešení silně závisí na typu použitého hardwaru, doporučuju na produkční mašině udělat nějaké benchmarky. Pro měření času zpracování se ideálně hodí tahle fičura.
- Filip Procházka
- Moderator | 4668
Tys ale nepochopil, že Nette\Database přesně tento problém řeší inteligentním pokládáním dotazů. Stačí správně napsat model.
use Nette\Database\Table\ActiveRow;
public function getInstituteData(ActiveRow $institute) {
//počet dotazov na databázu - jeden
foreach($institute->related('project_institute') as $project_institute) {
$project[] = $this->getProjectData($project_institute->project);
}
}
public function getProjectData(ActiveRow $project) {
//počet dotazov na db - jeden
foreach($project->related('institute_project') as $project_institute) {
//ďalší kód
}
}
A voláš
$institute = $db->table('institute')->get($id);
$model->getInstituteData($institute);
Stejně pak třeba
$project = $db->table('projects')->get($id);
$model->getProjectData($project);
- ricco24
- Člen | 141
Priznávam, v provom poste som zle napísal počty dotazov na db.
HosipLan tvoje riešenie pomocou predávania objektu je lepšie no nerieši môj
problém.
Dajme tomu že related projektov k inštitúcii bude 500. To znamená že pri volaní
$institute = $db->table('institute')->get($id);
$model->getInstituteData($institute);
by sa vykonal 1 dotaz pri query related(‚project_institute‘) na inštitúciu no ďalších 500 dotazov na related(‚project_institute‘) pri projekte …
Editoval ricco24 (7. 4. 2012 15:07)