Code d'abord contre base de données d'abord

77

Lorsque je conçois et crée le logiciel sur lequel je travaille, je conçois et crée d'abord les tables SQL principales, puis je passe à la programmation proprement dite. Le projet sur lequel je travaille actuellement me laisse perplexe. Ceci est probablement dû à un manque d'exigences solides et solides, mais je ne peux malheureusement rien faire à ce sujet cette fois-ci. C'est une situation du genre "il suffit d'y aller", mais je m'éloigne du sujet.

Je pense renverser mon flux de travail et créer d'abord les classes d'interface utilisateur et de modèle de données dans l'espoir que cette opération m'indique clairement à quoi ressemblera mon schéma de base de données. Est-ce une bonne idée? Je suis nerveux car je vais me retrouver avec une interface utilisateur et toujours aucune idée de la façon de structurer la base de données.

Si quelqu'un est curieux, j'utilise SQL Server comme serveur principal et MS Access comme application frontale. (L'accès n'est pas mon choix non plus ... alors, je vous en prie, ne détestez pas trop.)

Canard en caoutchouc
la source
6
@gn: c'est complètement différent.
Robert Harvey
1
Si cela devient un doublon, cela devrait être un doublon de cette question . Les réponses et la question sont plus en phase avec ce que je demande.
RubberDuck
1
@Mawg c'est un projet de travail. J'ai repoussé tout ce que j'ai pu pour que les exigences soient bien définies. Le travail doit commencer là-dessus et je ne peux rien faire de plus à ce sujet.
RubberDuck
4
Euh, nouvel emploi? Je sais que je le ferais. Mais en tant que pigiste depuis 30 ans, je trouve qu’il est facile de partir avant que cela ne frappe vraiment le fan (certaines personnes ne peuvent tout simplement pas aider), mais je me rends compte que ce n’est pas si facile pour tous. Restez si vous devez (employeur non comparable dans la région, etc), mais ne restez pas si cela commence à vous toucher
Mawg

Réponses:

85

Qu'est-ce qui est apparu en premier, le processus ou les données utilisées par ce processus? Je sais que c’est un peu la question de la "poule ou de l’œuf", mais dans le cas des logiciels, je crois que c’est le processus.

Par exemple, vous pouvez construire votre modèle de données de manière incrémentielle en implémentant un seul cas d'utilisation à la fois avec juste une persistance en mémoire (ou quelque chose d'aussi simple à implémenter). Lorsque vous estimez avoir implémenté suffisamment de cas d'utilisation pour décrire les entités de base, vous pouvez remplacer la persistance en mémoire par une base de données réelle, puis continuer à affiner le schéma à mesure que vous avancez.

Cela détourne l'attention de la base de données et la déplace au cœur du problème: les règles métier. Si vous commencez par implémenter les règles de gestion, vous finirez par trouver (selon un processus très similaire à Natural Selection) les données dont l'entreprise a réellement besoin. Si vous commencez par modéliser la base de données, sans savoir si ces données sont vraiment nécessaires (ni dans ce format, ni à ce niveau de normalisation, etc.), vous finirez par effectuer de nombreux ajustements tardifs. le schéma (qui peut nécessiter de lourdes procédures de migration, si l'entreprise l'exécute déjà), ou vous devrez implémenter des "solutions de rechange" dans les règles de gestion pour compenser le modèle de données désaccordé.

TL; DR: La base de données dépend de l’entreprise - elle est définie par elle. Vous n’avez pas besoin des données sauf si vous avez un processus qui fonctionne avec elles (un rapport est aussi un processus). Commencez par mettre en œuvre le processus et vous découvrirez les données dont il a besoin. Modélisez d'abord les données, et vous pourrez peut-être simplement compter le nombre d'hypothèses erronées lors de la modélisation.

Un peu en dehors du sujet, mais très important: le flux de travail que je décris est souvent utilisé avec des pratiques très importantes telles que "La chose la plus simple qui puisse fonctionner", un développement piloté par des tests et une focalisation sur le découplage de votre architecture des détails se mettre en travers de votre chemin (indice: base de données). À propos du dernier, cette discussion résume assez bien l’idée.

MichelHenrich
la source
1
"La base de données est un détail". Merci beaucoup pour le lien. Je crois sincèrement que je pourrai aborder ce projet en laissant la base de données sous forme de décision différée après avoir regardé la conversation.
RubberDuck
6
Et juste pour donner un nom: Ces pratiques sont toutes (sans doute les plus importantes) du développement Agile (développement incrémental, la chose la plus simple qui puisse fonctionner, basé sur des tests, les besoins des utilisateurs en premier, etc.).
Sleske
8
Je voulais revenir et merci encore. Tout mon groupe intermédiaire fonctionne sans base de données et je sais maintenant très bien comment les données doivent être conservées. Je ne peux pas vous remercier assez. Je voterais encore si je le pouvais.
RubberDuck
12
Si vous capturez réellement toutes les exigences à l'aide de votre méthode de code d'abord et que vous les exprimez réellement dans votre base de données finale , je peux accepter cette réponse. Mais j'ai vu beaucoup, beaucoup de projets où la satisfaction d'obtenir quelque chose de "travail" donne à penser que "si ça marche, la base de données doit être assez bonne", même s'il s'agit d'une conception de base de données HORRIBLE , avec des problèmes de performances inévitables et graves. plus tard. En outre, beaucoup de gens semblent penser que si le code valide des données, vous n'avez pas besoin de contraintes CHECK ou FOREIGN KEY. Vous faites .
Ross Presser
2
Cela est peut-être couvert dans la vidéo - malheureusement, je ne peux pas vous en parler maintenant - mais un autre avantage de l'approche incrémentielle est que, une fois cette opération effectuée correctement, elle permet de consolider des spécifications vagues. "Cet écran donne-t-il l'impression qu'il capture toutes les informations de contact dont vous avez besoin? Les champs sont-ils disposés dans un ordre qui convient à votre flux de travail?" Être capable de poser ces questions - avec quelque chose de concret comme référence - est souvent le seul moyen d'obtenir les informations dont vous avez besoin.
David
17

Une analyse de la cause première suggère que ce problème n’est pas un problème de méthode, mais plutôt un manque de spécification. Sans l'un, ce que vous écrivez d'abord n'a pas vraiment d'importance - vous allez le jeter de toute façon.

Faites-vous une faveur et faites une analyse basique des systèmes - identifiez des utilisateurs à différents niveaux, créez un questionnaire rapide et sale, éteignez votre machine, prenez un café et des biscuits / beignets (ou tout ce qui lubrifie les roues), puis promenez-vous demandez-leur ce qu’ils font et ce qu’ils doivent savoir / enregistrer pour faire leur travail, même si cela semble évident - demandez toujours. Ne vous inquiétez pas de leur importance. S'ils sont trop occupés, prenez les dispositions nécessaires pour revenir ou leur laisser la tâche.

Une fois que vous avez cela, vous devriez pouvoir commencer à construire ce que vous pensez qui vous donnera les meilleurs résultats et attendre que le reste de la spécification entre en jeu.

James Snell
la source
Je suis tout à fait d'accord, mais cela ne se produira pas. Merci pour votre temps cependant.
RubberDuck
9
Si vous n'avez pas le temps de le faire correctement, où allez-vous trouver le temps de le faire?
Walter Mitty
Qui a dit quoi que ce soit à propos de ne pas le faire correctement @WalterMitty? S'il vous plaît voir le lien vidéo dans la réponse acceptée. La base de données est un détail qui n'a pas besoin d'être en place pour résoudre 95% du logiciel.
RubberDuck
1
J'ai compris que "ça ne va pas arriver" signifie que vous allez passer au code sans même avoir la moindre idée de ce que les informations que les parties prenantes ont besoin du système. Je pense que James vous a donné de très bons conseils pour analyser des systèmes de base sans vous perdre dans la paralysie de l’analyse.
Walter Mitty
Vous m'avez mal compris @WalterMitty. J'ai adopté une approche de boucle de rétroaction. Je construirai ce que je pense qu'il devrait (sans base de données), puis je l'apporterai aux utilisateurs. Modifier le programme. Répéter. Après quelques itérations, je devrais savoir exactement à quoi ressemblera la base de données. Si je comprends bien, l’approche Agile est spécifiquement conçue pour faire face à des exigences peu claires. C'est voir en moi bien sur ce projet.
RubberDuck
12

Mon expérience est la suivante:

  • Dans la plupart des projets sur lesquels j'ai travaillé, nous avons d'abord conçu la base de données.
  • Il arrive souvent que des données existent déjà dans des feuilles de calcul, des bases de données traditionnelles, du papier, etc. Ces données vous donneront des indications sur les tables dont vous avez besoin pour les conserver.
  • Souvent, un processus est déjà utilisé, mais manuellement ou à l'aide de plusieurs outils disparates qui ne sont pas automatisés, qui ne fonctionnent pas entre eux et / ou ne sont pas conformes aux normes.
  • Une fois que vous avez un modèle de base de données semi-mature, vous pouvez commencer à concevoir des formulaires prototypes, des fenêtres, etc., qui lisent et écrivent dans cette base de données.
  • Au fur et à mesure que vous continuez, certains changements seront nécessaires pour prendre en compte des éléments non envisagés au début.

Rappelez-vous aussi:

  • Ce n'est plus un monde avec une seule application <-> une base de données. Peut-être que votre application devra lire ou écrire des données provenant de plusieurs bases de données ou que votre solution comportera plusieurs applications utilisant la même base de données.

Conclusion: je vous recommande de concevoir d'abord la base de données.

Tulains Córdova
la source
Ce sont toutes les choses tout à fait vrai, et en fait , ce sera remplacerez un « non-processus » et d'un tableur, mais je ne vois pas comment cela est une réponse à ma question. Pouvez-vous clarifier s'il vous plait?
RubberDuck
1
@RubberDuck J'ai ajouté une clarification à la fin de ma réponse.
Tulains Córdova
11

J'allais dire Base de données d'abord, car j'ai beaucoup d'expérience dans les grands projets et vous avez vraiment besoin d'un modèle de données solide si plusieurs développeurs travaillent en parallèle.

Mais ensuite, j'ai réfléchi un peu plus et j'ai réalisé que ce que nous faisions réellement sur les grands projets les plus réussis était "les exigences d'abord".

Un bon ensemble d'exigences métier bien spécifié conduit à un bon ensemble d'exigences fonctionnelles. Si vous avez un bon ensemble d’exigences fonctionnelles, le modèle de données et les spécifications de module s’imposent sans effort.

James Anderson
la source
C'est exactement comme ça que je travaille typiquement. Les exigences d'abord , oui. Je souhaiterais pouvoir faire passer des exigences solides à quelqu'un en ce moment.
RubberDuck
Les exigences d'abord, bien que vous ne devriez pas attendre que les exigences soient complètes (elles ne le sont jamais). Commencez dès que vous en avez assez pour vous faire une idée des objectifs de l'application, puis obtenez-en plus lorsque vous en avez besoin.
Sleske
@sleske - Un bon analyste doit avoir une idée des éléments les plus "dynamiques" (c.-à-d. vagues et modifiables) des exigences et créer une certaine flexibilité dans la conception pour pouvoir gérer facilement les caprices des utilisateurs.
James Anderson
1
@ JamesAnderson: En fait, je suis un grand fan des principes de développement agiles, dans lesquels vous ne concevez que pour ce dont vous avez besoin maintenant , à moins que vous ne sachiez que vous ne pourrez pas modifier le design plus tard (rarement le cas). Mais je commence à sortir du sujet ...
dimanche
8

Étant donné que cela semble si fluide / non spécifié, je commencerais par l'interface graphique frontale. Cela ressemble à ce dont vous avez besoin pour obtenir des réponses, du soutien, du temps et des commentaires des parties prenantes, n'est-ce pas? Ils se moquent de vos brillantes tables normalisées et de vos contraintes de clés étrangères et de vos suppressions en cascade. Mais une interface graphique cool avec beaucoup de couleurs brillantes - eh bien, c'est top!

Pour la "base de données" initiale, utilisez quelque chose d'extrêmement simple, peut-être juste des clés / valeurs stockées dans un fichier. Je ne suis pas familier avec MS Access, donc je ne sais pas ce que serait le backend "le plus léger". (une table écalée?) Quoi que ce soit qui soit rapide et sale, envisagez de le jeter.

Si vous le pouvez, utilisez une interface amusante dans l'interface graphique pour indiquer clairement qu'il s'agit d'un prototype. Si tout échoue, utilisez des fiches.

Maintenant, peut-être que vos intervenants sont des experts de la base de données - cela a parfois été le cas avec moi! - Dans ce cas, réalisez certaines conceptions de base de données.

utilisateur949300
la source
3
+1 pour "ni le code d'abord" ni "la base de données en premier" mais "le prototype de gui non fonctionnel en premier" (alias "prototypage rapide"), car en l'absence d'exigences, le prototype de gui permet de clarifier les exigences des utilisateurs finaux.
k3b
1
C'est vrai, mais cela leur fait aussi croire que l'application est aussi bonne que faite. J'ai été brûlé de cette façon auparavant et maintenant, je demande que nous
répondions d'
@ Mawg oui, malheureusement c'est un danger. Une option (au moins en Java) consiste à utiliser un "look and feel" étrange pour indiquer clairement qu'il s'agit d'un prototype.
user949300
Si vous ne savez pas où vous allez, tout code vous y mènera.
-1

Comme les exigences ne sont pas claires, on peut commencer avec un modèle de données très rudimentaire avec les éléments clés dont vous saurez avoir besoin, peut-être juste des tables de base et des clés en main pour commencer. Le reste des données est sérialisé en binaire ou en XML et stocke le BLOB dans la base de données pour commencer. Cela devrait permettre de développer l'interface utilisateur et la couche métier (niveau intermédiaire) sans modèle entièrement relationnel, mais vous disposerez toujours de la persistance pour enregistrer et récupérer des recherches de clés simples, selon vos besoins.

Par exemple, vous avez peut-être une personne, alors vous avez une clé d'identification de personne. Le reste des attributs n'étant pas connu, commencez simplement par une table de personnes avec un identifiant de personne PK et une autre colonne qui stockera le blob, toutes les données de la personne.

Une fois les exigences consolidées, prenez vos blobs, extrayez toutes les tables et colonnes nécessaires et rendez le modèle relationnel. Ensuite, il suffit de changer la persistance d'un BLOB vers le relationnel dans la couche d'accès aux données. Mais tout le reste, l'interface utilisateur des règles commerciales, etc. fonctionnera toujours. Notez que cela ajoute un peu de temps au projet mais permet une flexibilité complète pour ajouter et supprimer des éléments si nécessaire sans modifier le modèle relationnel jusqu'à ce que les choses deviennent plus fermes.

La recherche peut être retardée car vous ne pouvez pas interroger un BLOB. Par conséquent, dès que le modèle se stabilise, commencez à stocker vos données à rechercher dans des colonnes relationnelles.

Fondamentalement, vous commencez avec un modèle tabulaire et passez à un modèle relationnel au fur et à mesure de l'avancement du projet.

Vous pouvez également préciser les exigences avant le début des travaux afin de pouvoir développer un modèle relationnel.

Jon Raynor
la source
De cette façon, la folie se trouve. Ne persistez jamais les données tant que vous n'êtes pas prêt à les conserver. Normaliser les données après coup est un cauchemar.
RubberDuck
1
Il y a une différence entre la persistance et la normalisation. La question à laquelle vous seul pouvez répondre est la suivante: ai-je besoin de persister uniquement ou de persister et de normaliser. Un modèle de données est un modèle. S'il n'y a pas d'exigences, il est difficile de modéliser quelque chose de manière relationnelle.
Jon Raynor
-2

En général, je pense que le code vient après les données car il va manipuler les données.

Si les exigences ne sont pas claires, vous pouvez créer un modèle de données de votre interprétation des exigences. Le mieux est peut-être de noter certaines exigences et de les envoyer à votre employeur, ils auront alors quelque chose à tirer. Ou créez d'abord une interface graphique, cela dépend du type d'employeur qui fonctionne le mieux :)

Kein IhpleD
la source
3
cela ne semble rien offrir de substantiel sur les points soulevés et expliqués dans les 5 réponses précédentes
gnat
Mon point est de suivre l'approche en fonction du type de client
Kein IhpleD