Quelle est la meilleure façon d'abstraction de la base de données à partir d'une application PHP?
Ma question est comment fait un résumé d'une connexion de base de données de la couche modèle d'une application? La préoccupation principale est d'être en mesure de modifier facilement à partir de différents types de bases de données. Peut-être que vous commencez avec un fichier plat, délimitée par des virgules de la base de données. Ensuite, vous voulez passer à une base de données SQL. Puis, plus tard vous décidez LDAP mise en œuvre serait mieux. Comment une personne peut facilement planifier quelque chose comme cela?
Pour un exemple simple, imaginons que vous disposez d'un utilisateur avec un nom, prénom et email. Très simple à une classe PHP qui la représente peut ressembler à ceci (s'il vous plaît ignorer les problèmes avec le service public de variables d'instance):
<?php
class User {
public $first;
public $last;
public $email;
}
?>
J'ai souvent vu où les gens ont une classe DAO qui a le SQL intégré en tant que tel:
<?php
class UserDAO {
public $id;
public $fist;
public $last;
public $email;
public function create( &$db ) {
$sql = "INSERT INTO user VALUES( '$first', '$last', '$email' )";
$db->query( $sql );
}
}
?>
Mon problème avec des stratégies comme c'est quand que vous souhaitez modifier votre base de données, vous devez modifier chaque classe DAO " créer, mettre à jour, de charger, de supprimer les fonctions de traiter avec votre nouveau type de base de données. Même si vous avez un programme d'auto-générer pour vous (dont je ne suis pas particulièrement un fan de), vous devez modifier ce programme pour le faire fonctionner maintenant.
Quelles sont vos suggestions pour savoir comment gérer cela?
Mon idée est de créer une super-classe pour les objets DAO avec sa propre création, suppression, mise à jour, la charge de fonctions. Cependant, ces fonctions devraient prendre tableaux des attributs de la DAO et de générer la requête elle-même. De cette manière, la seule SQL est dans le SuperDAO de classe plutôt que d'être dispersés sur plusieurs classes. Alors si vous vouliez changer votre couche de base de données, vous n'avez qu'à changer la façon dont le SuperDAO classe génère les requêtes. Avantages? Les inconvénients? Prévisible des problèmes? Le bon, la brute et le truand?
Vous devez vous connecter pour publier un commentaire.
À l'aide d'un ORM est généralement le moyen privilégié de l'abstraction de la base de données. Une liste incomplète de PHP implémentations sont disponibles sur Wikipédia.
Vous pouvez utiliser différents cadres comme PDO, PEAR::MDB2 ou Zend_Db, mais pour être honnête, en 12 ans de développement en PHP, je n'ai jamais eu de transition d'un type d'infrastructure de stockage de données à l'autre.
Son extrêmement rares à aller de quelque chose d'assez similaire, comme Sqlite, MySQL. Si vous ne faire plus que cela, vous auriez beaucoup plus de problèmes de toute façon.
Je suis venu avec un concept intéressant qui permettrait aux développeurs de créer des de base de données agnostique code, mais à la différence de l'ORM va pas sacrifier la performance:
Le résultat est Agile de Données - base de données access cadre (voir la vidéo pour plus d'explications).
De problèmes de la vie réelle de la tâche avec DB-agnostique de code et de Données flexible
$db
(un mot de fantaisie pour connexion DB), ce qui pourrait être un fichier CSV, SQL ou LDAP.$db
et d'exprimer votreAction
Action
Au point de ce cadre permettra de déterminer la meilleure stratégie étant donné les capacités de la base de données, permettra de mapper les champs de la déclaration, de préparer et d'exécuter des requêtes pour vous, afin que vous n'avez pas à les écrire.
Exemple De Code
Mon extrait de code suivant permet de résoudre une assez complexe problème de la détermination de quel est le courant total de la dette de tous nos clients VIP. Schéma:
Suivant est le fournisseur indépendant de code:
La requête si
$db
est SQL:Pour d'autres sources de données, l'exécution de la stratégie pourrait lourd et encore plus de données, mais serait de travailler de manière cohérente.
Je pense que mon approche est un excellent moyen de résumé de la base de données et je travaille pour le mettre en œuvre sous licence MIT:
https://github.com/atk4/data
Vous devriez regarder dans le La librairie PDO.
Le meilleur moyen est d'utiliser un ORM (Object-relational mapping) de la bibliothèque. Il y en a beaucoup pour PHP. J'ai personnellement utilisé et peut recommander orm doctrine (je l'ai utilisé en combinaison avec des silex, qui est un minimaliste framework php).
Voici un StackOverflow thread à propos de PHP Orm où vous pouvez trouver quelques solutions de rechange si vous le souhaitez: Bon PHP ORM Bibliothèque?
Ça sonne bien en théorie, mais dans tous les probabilité YAGNI.
Vous serait mieux d'utiliser un SQL bibliothèque comme AOP et ne pas se soucier LDAP jusqu'à ce que vous y arrivez.
En règle générale, si vous vous donnez la peine d'utiliser une base de données, alors votre demande pourront bénéficier de l'aide des fonctionnalités spécifiques à une "marque" de la base de données, et sera plus solide app pour elle.
Il est très rare de passer d'un système de base de données à l'autre. Le seul moment où l'on pourrait, de manière réaliste de considérer que les aa caractéristique qui mérite d'être mise en œuvre est que si vous écrivez une sorte de système faiblement couplé ou d'un cadre destiné à la consommation de masse (comme le Zend Framework, ou Django).
J'ai toujours aimé utiliser ADOdb. De ce que j'ai vu, on dirait qu'il est capable de passer très différentes plates-formes.
http://adodb.sf.net
En fait, la solution pour le thème "où en œuvre logique d'accès aux données?" n'est pas complexe. Tout ce que vous avez à retenir est que votre modèle de code doit être séparé de votre code d'accès aux données.
Comme:
Modèle de couche avec un peu de logique métier de l'Utilisateur::name() la méthode
Couche d'accès aux données:
Utilisation:
Dans cet exemple, il est évident que vous pouvez toujours modifier vos données d'accès de la classe Lien qui permettra d'exécuter des requêtes sur n'importe quoi (Cela signifie que vous pouvez enregistrer vos utilisateurs sur un serveur comme vous le lien modifier).
Dans le même temps, vous devez nettoyer la couche de modèle de code qui vit de manière autonome et n'a aucune idée de qui et où est l'enregistrement de ses objets.
Également les bases de données de classe ici semble inutile, mais en fait ça peut donner naissance à de grandes idées comme la collecte de nombreux liens un exemple pour de nombreux db connections dans un projet.
Il y a aussi seul fichier plus simple et le tout-puissant cadre appelé db.php(http://dbphp.net) qui est construit sur le modèle que j'ai décrit ici, et même crée automatiquement des tables avec la capacité de contrôler pleinement son standard sql champ/table de paramètres et de synchronisation de base de données de la structure de votre modèle chaque fois que vous le souhaitez.
Axon ORM détecte automatiquement les modifications dans votre schéma, sans vous obliger à reconstruire votre code.