2010-09-18 6 views
1

Je connais plusieurs façons d'éviter de dupliquer du code PHP (dans mon cas PHP). Cependant, je développe une assez grande application qui fait des calculs sur la base de données avec les données qu'elle trouve, et j'ai remarqué la nécessité d'utiliser le même code (parties de SQL) dans d'autres endroits.Comment éviter la duplication de code SQL?

Je n'aime pas l'idée de copier et coller la même chose encore et encore. Quel est un bon moyen de le faire? Dois-je utiliser des procédures stockées? Je pourrais presque calculer certaines choses en PHP sauf que la plupart du temps les requêtes calculent des valeurs basées sur des données non retournées par la requête et il semble stupide de renvoyer des données supplémentaires à PHP pour qu'il puisse faire ses calculs. Parfois, ça peut aller, mais maintenant ça ne le fait pas.

Que dois-je faire?

Par exemple, partout dans de nombreuses requêtes SQL je calcule comme ceci:

... 
(SELECT SUM(amount) FROM IT INNER JOIN Invoice I WHERE IT.invoiceId=I.id) AS total 
... 
FROM InvoiceTransaction IT 
... 

Notez que je suis à la maison maintenant donc je vous écris ce du haut de ma tête.

+0

Quelle base de données? Je suppose que c'est MySQL mais on ne sait jamais ... –

+0

Oh, oui, c'est MySQL. – Tower

+0

il est très difficile de répondre sans un exemple réel. –

Répondre

2

Je pense que vous avez 2 solutions:

  1. si le SQL retourne une petite quantité de données, je voudrais simplement envelopper l'invocation SQL dans un appel de méthode et de l'appeler (le paramétrage nécessaire)
  2. si le SQL gère beaucoup de données, je conserverais ces données dans la base de données et utiliserais une procédure stockée. Vous pouvez ensuite appeler cette procédure stockée sans dupliquer le code (mais envelopper l'appel proc stocké dans une fonction et l'appeler - comme dans l'option 1)

Je ne reculerais pas forcément devant les procédures stockées. Mais je conseillerais de garder la logique d'affaires hors d'eux (gardez-le dans l'application elle-même) et assurez-vous que vous avez suffisamment de tests unitaires autour d'elle.

1

Je ne préfère pas la procédure de stockage, surtout pas pour le refactoring. Vous devriez envisager d'écrire une fonction qui retourne l'enregistrement dont vous avez besoin, et mettez vos requêtes SQL dans cette fonction afin de pouvoir l'appeler au lieu de mettre votre SQL partout.

1

Je pense que nous aurions besoin d'un exemple de requête. Procs stocké pourrait être une bonne option. Ou une alternative pourrait être d'utiliser des vues. L'avantage de disposer de vos requêtes dans les vues ou les procédures stockées est que vous pouvez souvent utiliser la base de données pour voir où vos tables sont utilisées. Inconvénient est que vous vous enfermez dans une base de données, mais vous le faites probablement de toute façon.

Questions connexes