Une bonne conception de base de données n'a rien à voir avec une bonne conception d'objet.
Si vous prévoyez d'utiliser la base de données pour autre chose que la simple sérialisation de vos objets (comme des rapports, des requêtes, une utilisation multi-applications, de la business intelligence, etc.), je ne recommande pas un simple mappage des objets aux tables.
De nombreuses personnes considèrent qu'une ligne d'une table de base de données est une entité (j'ai passé de nombreuses années à penser en ces termes), mais une ligne n'est pas une entité. C'est une proposition. Une relation de base de données (c'est-à-dire une table) représente une déclaration de fait sur le monde. La présence de la ligne indique que le fait est vrai (et inversement, son absence indique que le fait est faux).
Avec cette compréhension, vous pouvez voir qu'un seul type dans un programme orienté objet peut être stocké dans une douzaine de relations différentes. Et une variété de types (unis par l'héritage, l'association, l'agrégation, ou complètement non affiliés) peuvent être partiellement stockés dans une seule relation.
Il est préférable de se demander quels sont les faits que vous souhaitez conserver, les questions auxquelles vous souhaitez obtenir des réponses et les rapports que vous souhaitez générer.
Une fois que la conception appropriée de la base de données est créée, il est facile de créer des requêtes/vues qui vous permettent de sérialiser vos objets dans ces relations.
Exemple :
Dans un système de réservation d'hôtel, vous devrez peut-être enregistrer le fait que Jane Doe a réservé une chambre au Seaview Inn du 10 au 12 avril. S'agit-il d'un attribut de l'entité client ? Est-ce un attribut de l'entité hôtel ? S'agit-il d'une entité de réservation dont les propriétés incluent le client et l'hôtel ? Dans un système orienté objet, il peut s'agir de tout ou partie de ces éléments. Dans une base de données, ce n'est rien de tout cela. Il s'agit simplement d'un simple fait.
Pour voir la différence, considérez les deux requêtes suivantes. (1) Combien de réservations d'hôtel Jane Doe a-t-elle pour l'année prochaine ? (2) Combien de chambres sont réservées pour le 10 avril au Seaview Inn ?
Dans un système orienté objet, la requête (1) est un attribut de l'entité client, et la requête (2) est un attribut de l'entité hôtel. Ce sont les objets qui exposent ces propriétés dans leurs API. (Même si, évidemment, les mécanismes internes par lesquels ces valeurs sont obtenues peuvent impliquer des références à d'autres objets).
Dans un système de base de données relationnelle, les deux requêtes examineraient la relation de réservation pour obtenir leurs numéros et, d'un point de vue conceptuel, il n'est pas nécessaire de se préoccuper d'une autre "entité".
Ainsi, c'est en essayant de stocker des faits sur le monde - plutôt qu'en essayant de stocker des entités avec des attributs - qu'une base de données relationnelle correcte est construite. Et une fois qu'elle est correctement conçue, des requêtes utiles qui n'avaient pas été imaginées pendant la phase de conception peuvent être facilement construites, puisque tous les faits nécessaires pour répondre à ces requêtes sont à leur place.
17 votes
Si vous vous intéressez aux "meilleures pratiques", la plupart des réponses sont tout simplement incorrectes. Selon les meilleures pratiques, la RDb et l'application sont indépendantes ; leurs critères de conception sont complètement différents. Par conséquent, "modéliser l'héritage" dans une base de données (ou modéliser la BDR pour l'adapter à une seule application ou à un seul langage d'application) est une très mauvaise pratique, mal informée, qui enfreint les règles de conception de base de la BDR et la paralyse.
0 votes
Duplication possible de Quelque chose comme l'héritage dans la conception de bases de données
8 votes
@PerformanceDBA Quelle est votre suggestion pour éviter l'héritage dans le modèle de base de données ? Disons que nous avons 50 types différents d'enseignants, et que nous voulons connecter cet enseignant particulier avec la classe. Comment pouvez-vous y parvenir sans avoir recours à l'héritage ?
1 votes
@svlada. C'est simple à mettre en œuvre dans une RDb, donc "héritage" nécessaire. Posez une question, incluez les définitions des tables et un exemple, et je vous répondrai en détail. Si vous le faites en termes OO, ce sera un désordre royal.
2 votes
Duplicata possible de Comment représenter l'héritage dans une base de données ?