Comment abordez-vous la conception d'une base de données? [fermé]

14

Je suis principalement développeur web et j'ai quelques projets personnels que je veux lancer.

Une chose qui me dérange est la conception de la base de données. J'ai traversé la normalisation de la base de données à l'école et des trucs comme ça, mais il y a quelques années et je n'ai jamais eu d'expérience en conception de bases de données relationnelles, sauf à l'école.

Alors, comment abordez-vous la base de données du point de vue d'une application Web? Comment commencez-vous et que recherchez-vous? Quels sont les drapeaux de prudence?

bron
la source
8
Une bonne conception de base de données pour les applications Web est identique à une bonne conception de base de données pour n'importe quelle application. Il existe de nombreux livres d'introduction disponibles qui couvrent bien les bases.
Robert Harvey
1
@harvey Des livres que vous pourriez recommander?
bron

Réponses:

14

Le meilleur livre que j'ai jamais acheté concernant la conception de bases de données était Database Design for Mere Mortals par Michael Hernandez ISBN: 0-201-69471-9. Amazon Listing J'ai remarqué qu'il a une troisième édition.

Lien vers la troisième édition

Il vous guide tout au long du processus (du début à la fin) de la conception d'une base de données. Je vous recommande de commencer par ce livre.

Vous devez apprendre à regarder les choses en groupes ou en morceaux. La conception de la base de données a des blocs de construction simples, tout comme la programmation. Si vous comprenez parfaitement ces blocs de construction simples, vous pouvez vous attaquer à n'importe quelle conception de base de données.

En programmation, vous avez:

  • Si construit
  • Si autre construit
  • Faire pendant les boucles
  • Faire jusqu'à boucles
  • Constructions de cas

Avec les bases de données, vous avez:

  • Tableaux de données
  • Tables de recherche
  • Relations individuelles
  • Relations un à plusieurs
  • Relations plusieurs à plusieurs
  • Clés primaires
  • Clés étrangères

Plus vous simplifiez les choses, mieux c'est. Une base de données n'est rien de plus qu'un endroit où vous mettez des données dans des trous de cubbie. Commencez par identifier ce que sont ces trous cubbie et quel genre de choses que vous voulez en eux.

Vous n'allez jamais créer la conception de base de données parfaite la première fois que vous essayez. C'est un fait. Votre conception passera par plusieurs améliorations au cours du processus. Parfois, les choses ne semblent évidentes que lorsque vous commencez à saisir des données, puis vous avez un moment ah ha .

Le Web apporte ses propres défis. Problèmes de bande passante. Apatridie. Données erronées provenant de processus qui démarrent mais ne se terminent jamais.

Michael Riley - AKA Gunny
la source
11

Je fais à la fois de la programmation orientée objet et de la conception de bases de données (principalement transactionnelles, mais certaines OLAP), et dans mon cas, il y a beaucoup de thèmes récurrents (au moins avec OLTP).

Pratiquer la normalisation 3nf m'aide à pratiquer une variante du principe de responsabilité unique. Un tableau doit représenter un concept dans votre système - et les concepts doivent être liés les uns aux autres de telle sorte qu'ils tentent d'imiter la réalité; par exemple, si je crée un système où un client peut avoir 0 ou plusieurs activités, je crée une table client et une table d'activité. La table d'activité a une relation de clé étrangère avec la table client. Lorsque je crée des procédures stockées, je m'assure d'utiliser une jointure externe pour joindre le client et l'activité, car l'exigence commerciale qu'un client puisse avoir 0 activités.

Je surveille également les possibilités d'extensibilité en utilisant des tables de pont (lien). Par exemple, si j'essayais de représenter une règle commerciale dans laquelle un livre pourrait avoir un nombre illimité (variable) d'auteurs, je créerais une table de livre, une table d'auteur et une table de pont / lien qui a des références de clé étrangère aux deux Livre et auteur.

De plus, j'utilise des clés de substitution sur toutes les tables (généralement des colonnes d'identité à incrémentation automatique, mais peut-être Guids - le compromis avec les guides dans le code est qu'ils occupent plus d'espace mémoire qu'un simple entier), et j'évite de compter sur des clés naturelles pour mon les recherches (sauf avec les tables Bridge / Link). Par défaut, je crée également des index sur les colonnes de clés étrangères courantes et j'examine de temps en temps les procédures stockées / requêtes système pour optimiser les stratégies d'indexation. Une autre stratégie d'indexation que j'utilise consiste à rechercher des emplacements dans mon code où je crée une collection basée sur une colonne de recherche et à ajouter des index appropriés aux colonnes de recherche.

Tim Claason
la source
10

Je conçois d'abord mon schéma de base de données, puis j'utilise un ORM pour en créer les objets. Je suis un peu vieille école de cette façon; Je ne fais pas confiance aux ORM pour créer un schéma de base de données intelligent et efficace. C'est le travail des humains et fait partie de l'art de la conception de logiciels.

Robert Harvey
la source
1
L'ORM n'invente pas votre schéma. Il le construit en fonction de ce que vous avez fait dans vos objets. Si vous construisez vos objets à partir de votre schéma, vous déléguez en fait une tâche importante à votre stupide ORM.
1
@ Pierre303 Le schéma est construit à partir des règles de programmation à l'intérieur de cet ORM qui peuvent ne pas parfaitement correspondre à votre situation / conception. Il peut créer une base de données sous-optimale. J'ai vu des trucs horribles sortir des ORM même au niveau de la requête.
m4tt1mus
@ Pierre303, je pense que ce commentaire montre exactement pourquoi c'est une mauvaise idée de construire à partir de l'ORm, une base de données correctement conçue ne doit pas correspondre directement aux objets utilisés dans une application. Il y a souvent beaucoup d'autres choses nécessaires pour concevoir correctement une base de données que cela ne prendrait pas en compte, ni deos, ni les structures les plus efficaces pour la base de données et non pour l'application.
HLGEM
@HLGEM: vous ne pouvez pas avoir travaillé avec des ORM avancés comme Hibernate et écrire ce commentaire
OH, comment l'ORM gère-t-il l'audit et les champs nécessaires à autre chose que votre application?
HLGEM
5

J'ai trouvé le livre de Bill Karwin, SQL Antipatterns , très utile pour la planification d'une base de données. L'argument le plus complet est que la base de données offre de nombreuses opportunités pour protéger l'intégrité et la pertinence de vos données, et que c'est une erreur courante des concepteurs d'ignorer ces fonctionnalités pour diverses raisons tentantes. Tenir compte de ces problèmes dès le départ et les laisser informer que la conception dans son ensemble en vaut la peine et vaut mieux essayer de recouvrir les fissures plus tard.

Je préfère utiliser une base de données qui a des contraintes complètes pour appliquer la logique métier et l'intégrité au niveau de la base de données. Souvent, je vois la base de données comme l'application et tout ce qui y accède comme une simple interface. Cela rend l'ajout d'autres "interfaces" une expérience plus agréable et simple, et présente des avantages positifs pour la sécurité.

Je pense également qu'il est important de considérer la structure de la base de données comme une entité changeante, plutôt que de supposer que vous devez la boucler et la sceller avant de commencer autre chose. Vous devez planifier les modifications et intégrer la base de données dans votre système de gestion des versions. Il y a un bel essai à ce sujet: Conception de base de données évolutive par Martin Fowler & Pramod Sadalage (et aussi un livre entier sur le sujet par Sadalage, bien que je ne l'ai pas lu).

Enfin, les problèmes périphériques de comptes / rôles utilisateur, matériel / emplacement / connexion de l'hôte, etc. sont importants et parfois négligés. Gardez cela à l'esprit également lors de la planification.

Ian Mackinnon
la source
5

la conception de la base de données ne peut pas se faire complètement sans considérer comment les données seront utilisées, voici donc une courte liste d'étapes:

  • écrire des phrases courtes capturant la relation entre les entités
  • dessiner un diagramme entité-relation représentant les phrases
  • créer un modèle de données logique normalisé à partir du diagramme ER
  • créer une matrice CRUD pour les applications et les entités
  • utiliser la matrice pour vérifier la couverture du cycle de vie de chaque entité
  • extraire les sous-schémas pour chaque application
  • examiner les chemins de navigation sur les sous-schémas pour chaque opération majeure / CRUD
  • considérer les rapports qui seront requis
  • concevoir le modèle de données physiques sur la base de tout ce qui précède; dénormaliser, partitionner et utiliser des schémas en étoile le cas échéant
Steven A. Lowe
la source
Vous feriez mieux de vous assurer d'obtenir le bon rapport si vous prévoyez de plaire aux personnes qui rédigent les chèques.
JeffO
3

Pour concevoir avec succès une base de données, vous devez d'abord considérer plusieurs choses:

  • Quelles données dois-je stocker et comment sont-elles liées aux autres données que je stocke. Comment ces données devront-elles évoluer au fil du temps? Dois-je pouvoir voir un instantané dans le temps (cette commande de 2009) ou ai-je seulement besoin de ce qui est courant (utilisateurs actifs uniquement)?
  • Comment puis-je m'assurer que mes données sont significatives et conservent leur signification au fil du temps (intégrité des données)?
  • Comment puis-je m'assurer que l'accès aux données est rapide?
  • Comment puis-je sécuriser mes données?

Donc, avant de commencer à concevoir une base de données, vous devez d'abord vous renseigner sur la normalisation et les fonctionnalités d'une base de données utilisée pour maintenir l'intégrité des données.

Ensuite, vous devez comprendre le réglage des performances. Ce n'est pas prématuré, les performances sont le point critique d'échec de la plupart des bases de données et il est très difficile à corriger une fois que vous avez des millions d'enregistrements.

Et enfin, vous devez comprendre comment sécuriser les données et quelles données doivent être sécurisées et quels contrôles internes vous devez mettre en place pour vous assurer que les données ne sont pas modifiées de manière malveillante ou pour vous assurer de suivre les changements au fil du temps pour savoir qui et quand une modification a été apportée et pour pouvoir revenir aux versions précédentes.

Il est également utile de lire un peu sur la refactorisation des bases de données avant de commencer car il devra être refactorisé plus tard et il est utile de savoir comment configurer les choses afin que vous puissiez refactoriser le plus facilement possible.

En général, les données survivent à l'application pendant de nombreuses années, elles sont au cœur de l'application et ne doivent pas être considérées comme un magasin de données stupide qui n'est généralement pas pertinent.

HLGEM
la source
2

En termes généraux, une bonne conception de base de données est une bonne conception de base de données - la plus grande question pour l'utilisation du Web sera de savoir comment accéder aux données et gérer les choses que l'on pourrait considérer comme nécessitant un état que le Web n'a pas.

En y réfléchissant, mon approche est basée sur vraiment beaucoup d'expérience ... mais que vous commenciez par un schéma ou des objets, vous essayez en fait de faire la même chose, c'est-à-dire de construire un modèle utilisable de vos données - pour un nombre substantiel de les projets, il est probable qu'il existe une relation assez directe entre le modèle et le schéma (pas dans tous les cas, et probablement pas pour toutes les tables / objets), donc il s'agit vraiment de construire un modèle décent en commençant où vous êtes à l'aise et en travaillant à partir de là.

En termes de construction d'un modèle décent - @Tim l'a pour les bases de données et fondamentalement la construction de votre modèle d'objet va être globalement similaire - ce qui est unique, ce qui est une hiérarchie, où existe-t-il de nombreuses relations, etc. accéder à une base de données, assurez-vous que vous faites toutes les bonnes choses.

Assurez-vous également que vous avez des scripts ou ddl dans le code pour vous permettre de créer le schéma à partir de zéro et de le mettre à jour lorsque vous apportez des modifications (ddl dans le code est ma méthode préférée - j'ai un système et cela fonctionne).

Murph
la source
2

Je commence par un grand tableau blanc et un tas de différentes couleurs de stylo. Différentes couleurs signifient des choses différentes. Et je commence juste à dessiner. Habituellement, je dessine des choses qui sont définies en noir, des choses qui sont probablement en bleu et des choses qui sont peu probables en vert. Le rouge est pour les notes importantes. J'efface et redessine copieusement. Je pense au type de choses que je dois interroger et je m'assure que le modèle le prend en charge. Si ce n'est pas le cas, je modifierai jusqu'à ce que ce soit le cas.

Finalement, si le modèle devient trop grand, je le déplacerai vers Visio et retravaillerai les pièces sur le tableau blanc.

Enfin, je pense aux points d'extension. La plus grande erreur que je vois la plupart des gens est de concevoir leur base de données, puis de dire "J'en ai fini avec la base de données" et de continuer. Vous n'avez jamais fini avec la base de données. Chaque demande de modification unique que vous recevez est susceptible de descendre jusqu'à ce niveau. Pensez donc à comment y ajouter. Réfléchissez aux types de demandes susceptibles de se produire et voyez si vous êtes en mesure de les connecter. Si vous ne pensez pas du tout à l'extensibilité, vous allez vous endetter sur la conception lorsque ces demandes de changement arriveront.

Quant à «SQL puis ORM» ou vice versa, cela dépend de vous. Assurez-vous d'abord que votre modèle constitue une bonne base.

Hounshell
la source
Un peu délicat ceci ... Je suis d'accord qu'il faut considérer l'avenir du projet (et le reste est bon, donc le vote positif) mais j'ai plus d'une fois eu des bases de données qui ont des champs et même des tables qui finissent par ne jamais être utilisées parce que J'ai conçu dans un avenir qui ne s'est jamais produit. Je tends maintenant fortement à construire pour résoudre le problème actuel - mais (et c'est ma carte "sortir de prison"), je m'assure d'avoir un mécanisme qui me permet de mettre à jour facilement le schéma (et puisque je le fais depuis le code peut appliquer des manipulations complexes dans le processus si nécessaire)
Murph
C'est exactement ce que j'essayais de faire passer. Construisez ce dont vous avez besoin, rien de plus. Mais si vous ne prévoyez pas d'expansion plus tard, eh bien, avez-vous déjà été aux heures de pointe dans la baie? C'est un exemple parfait de ce qui se passe lorsque vous ne pensez pas à la façon dont vous pourriez avoir besoin de vous développer.
Hounshell
Et pour mieux clarifier les couleurs: le noir est pour des choses que je sais correctes. Des choses généralement simples pour lesquelles il n'y a pas vraiment d'autre schéma logique. Le bleu est pour les choses que je peux décider de restructurer légèrement. Des choses qui ont probablement raison, mais je peux les effacer. Le vert est pour les choses où je fais vraiment du remue-méninges et je suis très susceptible d'effacer.
Hounshell
1

Je conçois d'abord des objets, puis j'utilise un ORM (tel que nHibernate) pour créer le schéma. Cela me donne beaucoup plus de flexibilité que de faire l'inverse.

L'étape suivante est l'optimisation du schéma généré.

Cela fait longtemps que je n'ai pas vu de projet où les tables de base de données ont été conçues en premier.


la source
Oui. À moins que vous ne soyez un gourou de la base de données, gardez la base de données aussi simple que possible. Il ne devrait être suffisant que pour prendre en charge l'application. La pré-optimisation est mauvaise. La pré-optimisation lorsque vous ne savez pas ce que vous faites est terrible. Si vous rencontrez des problèmes (et que vous ne le ferez probablement pas), faites appel à un véritable expert.
ElGringoGrande
1
@ElGringoGrande À moins que vous ne soyez un dbguru, vous n'avez aucune entreprise à concevoir une base de données pour une application autre que la plus rudimentaire. S'il aura besoin de plus de 10 tables et ne contiendra pas plus de 100 000 enregistrements et que vous n'avez pas de concepteur de base de données professionnel, vous vous trompez.
HLGEM
Eh bien merde. J'ai conçu une base de données contenant plus de 160 tables et des millions de lignes (la plus grande table a un peu plus d'un million d'enregistrements pour un client de taille moyenne. Le plus gros client en a plus de 5 millions). La plupart des clients ont plusieurs centaines d'utilisateurs simultanés et le plus grand compte plus de 2 000 utilisateurs. Et je ne suis pas DB Guru et nous n'en avons pas embauché un. J'ai fait plusieurs de ces conceptions de base de données pour différentes applications. Garçon, j'ai foiré.
ElGringoGrande
1
ElGringoGrande: Si vous avez conçu de telles bases de données, avec des centaines d'utilisateurs simultanés et des millions de lignes dans les tableaux et que les utilisateurs sont satisfaits, alors vous êtes db-guru. Vous ne l'avez peut-être pas encore réalisé.
ypercubeᵀᴹ
1

Peu de choses qui n'ont pas été explicitées jusqu'à présent par d'autres boursiers:

  • Il est préférable de confier la conception de la base de données à un professionnel. C'est bien sûr d'apprendre, mais je ne suggérerais pas de construire un modèle moyen ou grand si l'on n'est pas bien versé dans la modélisation ou la conception de bases de données. La raison en est que le coût d'une mauvaise conception est généralement très élevé.

  • Connaissez bien les objectifs du système et les besoins des utilisateurs. Sans connaître les exigences, vous ne pouvez pas concevoir le bon modèle de données.

  • Sachez quel code faire dans les programmes et quel code laisser la base de données prendre en charge. Ceci est nécessaire pour que vous définissiez correctement la valeur null, pas null, etc. de la colonne de données. Ceci est également requis pour que vous spécifiez correctement votre RI.

  • Déterminez bien vos clés primaires. Optez pour des clés simples quand vous le pouvez.

  • Tenez compte des besoins d'intégration avec d'autres applications.

  • Envisagez d'utiliser des modèles de données universels et suivez les normes de l'industrie en matière de dénomination et de taille des colonnes de données.

  • Pensez aux besoins futurs (lorsqu'ils sont connus et le cas échéant)

  • Faites réviser votre mode par d'autres.

  • Utilisez un outil pour la modélisation - Soit un outil ERD ou un outil UML.

  • Examinez et comprenez le code DDL généré. Ne le prenez pas pour acquis.

Aucune chance
la source