web-dev-qa-db-fra.com

Une fois que des valeurs de données réelles du code dur sont-elles dans le code, par opposition à l'utilisation d'un DB?

Une question de longue date pour moi a été: quand est-ce que je stocke des données (valeurs réelles) dans une table de base de données et quand puis-je les stocker directement dans le code?

Le consensus indiscuré a généralement été aussi tel que tel (*):

S'il s'agit d'une seule variable ou d'une structure simple, ou d'un tableau de quelques valeurs, mettez des données directement dans le code.

[* Consensus a été débattu dans des commentaires et des réponses, mais je voulais fondamentalement, je voulais une sorte de prémisse à démarrer la question, alors n'hésitez pas à contester et à améliorer] ==]

Exemple:

$number = 44;
$colors = array("blue", "yellow", ... "mauve");

S'il a des centaines + de lignes de données du même type, utilisez une base de données.

Mais il semble y avoir une zone grise; Qu'en est-il des cas qui ne sont pas si clairs? Quelles considérations et quels facteurs a-t-il besoin de faire attention afin de prendre une décision?

exemple:
[.____] Dites à votre entreprise utilise 10 à 15 types différents de cadres de moteurs pouvant être représentés comme "412T". Vous en avez environ 30 et ils changent rarement. Vous pouvez créer une table de base de données pour ceux-ci ou les codes hard dans une base de données. Dans ce cas, les moteurs sont statiques, des choses physiques qui ne sont pas susceptibles de changer souvent.

Les garder dans le code les soumet au contrôle de la source, où dans une base de données, les modifications de DB ne sont généralement pas suivies. Mais les garder dans une base de données libère (séparer) le code des données.

Un autre exemple (réel) que je peux utiliser est cette question de la mienne: https://stackoverflow.com/questions/26169751/how-to-best-get-the-data-out-fof-a-lookup- table (actuellement 48 lignes de données d'option).

17
Dennis

Je ne pense pas que ces deux déclarations représentent réellement un consensus sur lorsque les données du Code dur:

S'il s'agit d'une seule variable ou d'une structure simple, ou une matrice de quelques valeurs, placez les données directement dans le code

S'il a des centaines de rangées de données de même type, utilisez une base de données

Un simple contre-exemple (je suis sûr qu'il y en a de meilleurs): la programmation Les tables de syntaxe sont des structures complexes de grandes structures souvent codées difficiles. Jetez un coup d'œil à un exemple du code source PERL .

Au lieu de cela, je me concentrerais d'abord pour demander:

  • À quelle fréquence les données changent-elles?

  • Qui pourrait avoir besoin de le changer?

Si la réponse à "combien de fois" est "" est "plus souvent que je souhaite déployer une nouvelle version de mon application", vous ne devriez pas savoir le code du disque dur des données.

Si la réponse à "qui le change" est "n'importe qui en plus du programmeur", vous ne devez pas durer le code des données.

Dans un petit magasin, il est possible que la distinction entre le codeur et l'utilisateur a disparu et l'idée de "déploiement" a également disparu. Dans ce cas, vous êtes le roi de votre propre domaine et vous pouvez faire ce que vous voulez.

Mais même dans cette situation, la nécessité de collaborer peut être élaborée, ce qui peut être difficile si une application personnalisée ne suit pas une convention que les programmeurs suivent généralement.

33
x-code

J'irais avec la troisième option: un fichier de configuration!

Pour les applications que je travaille sur (en Java, tous mes exemples utilisent donc Java + Spring), de telles valeurs sont généralement stockées dans des fichiers de configuration et injectées (via le ressort) dans le code qui en a besoin lorsque l'application démarre. Dans un fichier de propriétés:

motorFramesString=412T, 413T, ...

Dans la configuration du printemps:

<bean="motorFrameManager" class="myCompany.MotorFrameManager" >
    <property name="motorFrames" value="${motorFrames}"/>
</bean>

L'avantage de cela est que vous pouvez modifier ou ajouter plus de ces valeurs principalement statiques facilement, sans recompiler, et vous n'avez pas à vous soucier de remplir votre base de données (relationnelle) avec des données de référence (car cela semble être un préoccupation, et peut-être pas tout besoins pour être dans la base de données de toute façon).

Comme pour -pourquoi Ces valeurs doivent entrer dans un fichier de configuration au lieu d'un tableau de référence: Planifiez-vous principalement ces valeurs dans le code ou surtout dans la base de données? Si vous avez de nombreuses questions et procédures et procédures existantes qui dépendent de ces valeurs, il peut être préférable de les mettre dans la base de données comme des données de référence, car il est plus facile que de les charger de fichiers de configuration et de les envoyer en tant que paramètres à toutes les requêtes possibles/Affichage/procédure qui les référencent. Si les valeurs sont principalement utilisées dans le code de l'application, le fichier de configuration est probablement un meilleur choix.


Un exemple plus compliqué comme ce que votre lien pourrait être fait aussi, avec ou sans propriétés.

Dans Products.Properties:

productA.name=Product A 123
productA.hasMotor=true
productA.numFeet=1
productA.hasOutlet=true
productA.needsManual=true

productB.name=Product B 456
productB.hasMotor=false
productB.numFeet=1
productB.hasOutlet=true
productB.needsManual=true

Dans votre fichier de configuration Spring:

<bean name="productA" class="com.mycompany.Product">
   <property name="name" value="${productA.name}"/>
   <property name="hasMotor" value="${productA.hasMotor}"/>
   <!-- rest omitted for brevity -->
</bean>
<bean name="productB" class="com.mycompany.Product">
   <property name="name" value="${productB.name}"/>
   <property name="hasMotor" value="${productB.hasMotor}"/>
   <!-- rest omitted for brevity -->
</bean>
<!-- configure as many beans as needed -->
<bean="motorFrameManager" class="myCompany.MotorFrameManager" >
    <property name="motorFrames"> <!-- assumes that MotorFrameManager has a property motorFrames which is a List<Product> -->
        <list>
            <ref bean="productA"/>
            <ref bean="productB"/>
        </list>
    </property>
</bean>

La bonne chose à propos de ceci est que si vos données source sont une feuille de calcul (comme dans la question que vous avez liée à), vous pouvez utiliser des macros dans Excel pour générer automatiquement les propriétés et les extraits de ressort.

Je pense que la prémisse de la question n'est pas tout à fait juste. Le facteur de division n'est pas le Quantité d'enregistrements qui doivent changer, mais le fréquence des modifications ainsi que Qui les change.

La fréquence

Lorsque des données sont volatile, dans le sens où il change souvent et en dehors d'un cycle de libération du logiciel, il doit pouvoir être configuré en dehors des valeurs codées dur ou même des fichiers de configuration. Une base de données a du sens ici, surtout si l'application elle-même est capable de le maintenir.

Qui

Lorsque A client doit pouvoir modifier des données, il doit être modifiable de manière conviviale et en dehors d'un cycle de libération.

Dénominateur commun

Le fil courant ici est que lorsque les données doivent changer en dehors d'une version logicielle, elle doit être stockée dans une base de données. Les bases de données peuvent être mises à niveau lors d'une version, mais les données vivent sans être réinitialisées ou fortement modifiées. Lorsqu'un client doit pouvoir modifier les données (ou configurer la fonctionnalité), il doit être stocké dans une base de données avec une belle extrémité frontale qui est idiot-preuve.

Essai

Assurez-vous d'écrire des tests d'unité qui valident votre logiciel dans une variété de configurations. Peut-être que votre client active une invite facultative ou redéfinit un mètre sur des douze pieds égaux. Indépendamment de la façon dont le changement est raisonnable, si votre logiciel le permet, il est bien préférable de mieux valider que le changement fonctionne comme prévu, quelle que soit l'invenane.

10
user22815

Ce n'est ni la fréquence des changements ni la quantité de données qui décide où stocker des données.

Si les données sont nécessaires pour exécuter le programme, il fait partie du code de programme, de la conserver en constante. Toutes les autres données vont dans la base de données.

Bien sûr, les fichiers de configuration, les images, les sons, etc. sont généralement mieux stockés sur le système de fichiers.

4
winkbrace

S'il y a même la moindre chance, vous obtiendrez un appel téléphonique vous permettant de reconstruire une application, car quelque chose de codé dur a changé, alors ne le codez pas. À tout le moins, gardez-le dans un fichier de configuration ou une table de dB. Vous n'êtes pas obligé de fournir une interface utilisateur à la maintenir nécessairement, mais de composer et de modifier un fichier de configuration ou d'exécuter une mise à jour SQL sur une table est sûrement préférable de reconstruire tout le match de tir.

2
Alan B

La distinction est en effet une zone quelque peu grise, mais mon approche de ce type de problèmes est la variation de données de la production "? Tout ce qui change après le déploiement dans un environnement de production devrait aller dans la base de données, même pour des choses qui peuvent rarement changer.

Donc, la question que vous devriez demander n'est pas "à quelle fréquence va-t-elle changer?", Mais "peut-il changer?". Si une valeur pour une propriété peut varier dans la même itération de code (sans rien toucher d'autre dans le code) sur l'environnement de production, il entre dans la base de données.

1
Thyamarkos

Ce qu'il vous manque.

Si vous conservez ce type de données dans une base de données, il y a toujours la possibilité de la modifier à la volée et de changer complètement le comportement d'un système.

L'autre problème est qu'il n'existe pas de moyen simple d'obtenir des entrées de base de données via les systèmes de gestion de la source/de changement de source/de la construction automatique que vous devriez utiliser.

0
James Anderson

Une chose que vous ne devriez jamais continuer dans la base de données, ce sont les détails nécessaires pour accéder à la base de données.
[.____] Vous avez un peu d'attrape-22 si vous devez accéder à la base de données pour récupérer les chaînes, le nom d'utilisateur et le mot de passe de connexion pour cette même base de données après tout.

Hardcode IT? HMM, pourrait fonctionner si vous utilisez une sorte de base de données installée et expédiée avec l'application.
Fichier de configuration? Plus prometteur mais qu'en est-il de la sécurité du compte?

[.

[.____] En dehors de cela, il y a des choses qui ne changent jamais. Des choses comme les constantes naturelles (G, PI, E, vous le nommez), les choses peut-être comme certaines expressions régulières, telles que la validation du courrier électronique.

0
jwenting