Utilisation efficace POO PHP pour réduire les requêtes MySQL.

  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Octobre 5th, 2009, 2:22 pm

Je tente actuellement de réécrire une grande quantité de code de procédure sur mon site web dans les classes, afin que je puisse les réutiliser et de simplifier certains scripts qui sont en train de devenir incroyablement énorme. Pour la plupart des choses de base, ce n'est pas trop difficile, comme les emballages de base de données, une classe de connexion, des classes de modèle, etc...

Cependant maintenant Im essayant de représenter des ensembles de données dans ma base de données avec les classes. Par exemple, disons que j'ai 3 tables dans ma base de données: «Sports», «équipes» et «acteurs». Il peut y avoir beaucoup de sports, chaque sport peut avoir beaucoup d'équipes et chaque équipe peut avoir de nombreux joueurs (Beaucoup de "1 à plusieurs" relations dans ma base de données). Je souhaite créer une classe pour chacune d'elles, appelée "Sport", "Team" & "Player". Le problème, c'est beaucoup de ma programmation actuelle sur mon site Web est l'utilisation de bibliothèques de fonctions et de requêtes qui sont combinés avec un grand nombre de jointures. J'ai commencé à écrire quelques classes pour représenter celles-ci, cependant, quand j'arrive à appeler les données de la base de données et la planification de comment je vais mettre en oeuvre ces classes dans le long terme, je ne vois tout simplement pas une façon claire pour le faire, et de le faire efficacement.

Je suis tombé sur ceci, qui est sur le même problème Im avoir, mais je n'ai pas vraiment beaucoup sur la lecture des réponses: http://www.daniweb.com/forums/thread221776.html

Jusqu'à présent, Ive été faire ma base de données des appels se produisent lorsque l'objet / classe est chargé, mais normalement que / l'entité adjudicatrice objet finit par avoir besoin des données des tables de nombreux autres. Ive a aussi pensé Extension des classes ou simplement pour réaliser les agréger des classes (qui stockent des autres classes en elles-mêmes dans des tableaux), comme l'exemple suivant...

Note: il s'agit directement de pg. 119 du livre " Object Oriented PHP: concepts, techniques et Code »De Peter Lavin.
PHP Code: [ Select ]
<?php
class Player{
private $name;
private $position;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
public function setPosition($position){
$this->position = $position;
}
}
 
class Team{
private $players = array();
private $name;
public function __construct($name){
$this->name = $name;
}
public function addPlayer(Player $p){
$this->players[] = $p;
}
public function getPlayers(){
return $this->players;
}
public function getName(){
return $this->name;
}
?>
  1. <?php
  2. class Player{
  3. private $name;
  4. private $position;
  5. public function __construct($name){
  6. $this->name = $name;
  7. }
  8. public function getName(){
  9. return $this->name;
  10. }
  11. public function setPosition($position){
  12. $this->position = $position;
  13. }
  14. }
  15.  
  16. class Team{
  17. private $players = array();
  18. private $name;
  19. public function __construct($name){
  20. $this->name = $name;
  21. }
  22. public function addPlayer(Player $p){
  23. $this->players[] = $p;
  24. }
  25. public function getPlayers(){
  26. return $this->players;
  27. }
  28. public function getName(){
  29. return $this->name;
  30. }
  31. ?>


Ive a aussi pensé à tout en quelque sorte mon collecte de données en dehors de la classe et le déposer dans, qui n'a aucun sens ce que-si-jamais pour ce qui Im train de faire. Quand je google rien à voir avec la POO / data / MySQL optimisation, les résultats sont inondés avec des exemples wrapper base au lieu de ce que j'ai besoin de savoir. Quelqu'un sait-il un livre où je pourrais apprendre comment mieux s'y prendre ou ont une façon ils aiment à le faire?
There's no place like 127.0.0.1, badass part is now it's ::1
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Octobre 5th, 2009, 2:22 pm

  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Octobre 6th, 2009, 10:23 am

La seule façon vous pouvez vraiment faire ce efficace est une douleur dans le dos. Malheureusement les modèles de domaine ne correspondent pas à des modèles très propre base de données.

Cela étant dit vous pourriez chercher à faire de vous que votre modèle de domaine est propre et sur la charge d'un de vos objets primaires objets charge des enfants par rejoint par opposition à l'appel de chaque mécanisme objets enfants de charge. Cela est bien, mais vous rencontrez le problème que vous charger des données qui n'est pas vraiment nécessaire à ce stade.

L'option suivante consisterait à "charge paresseux» les objets enfants. Cela implique que lors du chargement de l'objet quand elle est nécessaire.

Il n'ya pas de véritable moyen d'optimiser ce qu'il n'y a pas de cache de requête et une fois que vous effectuez un appel et finir avec les objets qu'il est à peu près onLoaded. La seule façon de contourner cela (je ne sais même pas si PHP est capable de cela) est de charger des types communément utilisés dans un cache globalement accessibles. Lorsque vous interrogez vous l'ajoutez à le moteur de cache donc si jamais vous avez besoin pour récupérer cet objet de plus vous aller le chercher à partir du cache plutôt que de frapper de la DB. Il faudrait pour cela vous mettre à jour cet objet tout changement devrait être portées contre lui et ceux qui commettent les changements.

Encore une fois je ne sais pas combien vous allez bénéficier d'un mécanisme comme celui-ci que je sache, Java et. NET ont la capacité de construire un «moteur» qui maintient son état grâce à la durée de vie de l'application. Pas sûr PHP a un quelconque mécanisme permettant de faire cela à moins de commencer à bidouiller des choses dans l'OS
Watch me grow
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Octobre 6th, 2009, 5:45 pm

Hmmmm...Éclairant, merci pour cela. Je voudrais lire ce plus tôt. Je ne pense pas que sur la création d'une déclaration qui est simplement étendu via des jointures.

J'ai fini par faire unique instance de type classes avec des classes des enfants qui les étendre. Chacune des classes peuvent soit prendre un ID qui représente une ligne dans la base de données (et de la classe elle-même va charger les données via SQL avec une fonction de charge surchargé) ou la classe peut être alimenté de force données à sa fonction de charge d'une requête plus grosses individuellement .


PHP Code: [ Select ]
<?php
$Sport = new Sport($ID);
$Sport->do_something();
 
$Sport = new Sport(0,$QUERY_RESULT);
$Sport->do_something();
?>
  1. <?php
  2. $Sport = new Sport($ID);
  3. $Sport->do_something();
  4.  
  5. $Sport = new Sport(0,$QUERY_RESULT);
  6. $Sport->do_something();
  7. ?>


Donc, si je souhaite obtenir plusieurs instances ou de charger plusieurs instances d'un type de classe, j'ai fait des classes plus petites qui ne 1 query mais passent les données à la fonction de charge surchargé de chaque instance unique de chaque classe. Alors je peux faire quelque chose comme ceci:

PHP Code: [ Select ]
<?php
$Sports = new Sports();//does 1 big query and makes multiple calls to new Sport(0,$QUERY_RESULT); and returns an array of singular Sport() objects
foreach($Sports->get() as $Sport)
{
$Sport->do_something();
}
?>
  1. <?php
  2. $Sports = new Sports();//does 1 big query and makes multiple calls to new Sport(0,$QUERY_RESULT); and returns an array of singular Sport() objects
  3. foreach($Sports->get() as $Sport)
  4. {
  5. $Sport->do_something();
  6. }
  7. ?>


L'avantage de ce est-il l'air vraiment propre dans mon chauffeur, je peux aussi trier plusieurs instances telles facilement et avec la classe wrapper pluriel. Cependant, le problème avec des classes des enfants qui étendent les classes d'instance unique est de plus en plus la classe devient étendue, plus grande et plus les requêtes sont parce que je charger les données pour le TAPE pas dans la requête Childs. Aussi, il ya 2 requêtes par type de données dans le code source (1 pour la catégorie Sports et 1 pour la classe Sport [si elle a besoin de l'appeler]). Cependant, je pense que ce que vous avez dit avec des jointures résout ce problème, peut-être je pourrais trouver le moyen de garder une déclaration MySQL solides de l'enfant à enfant. Je pense que je pourrais faire cela tout en maintenant ce que je configuration.

Merci.

Oh BTW, savez-vous si son possible pour esquiver en utilisant le $ Sports-> get () dans l'exemple de code ci-dessus? Je ne pouvais pas retourner un tableau d'objets à partir du constructeur, donc j'ai dû faire une méthode get (), mais je voudrais qu'il a travaillé comme ceci:
PHP Code: [ Select ]
<?php
$Sports = new Sports();//returns an array of singular Sport() objects
foreach($Sports as $Sport)
{
$Sport->do_something();
}
?>
  1. <?php
  2. $Sports = new Sports();//returns an array of singular Sport() objects
  3. foreach($Sports as $Sport)
  4. {
  5. $Sport->do_something();
  6. }
  7. ?>
There's no place like 127.0.0.1, badass part is now it's ::1

Afficher de l'information

  • Total des messages de ce sujet: 3 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 170 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC