Une bonne conception de base de données n'a rien à voir avec une conception d'objet appropriée.
Si vous envisagez d'utiliser la base de données pour autre chose que la simple sérialisation de vos objets (tels que des rapports, des requêtes, une utilisation multi-applications, une veille stratégique, etc.), je ne recommande aucun type de simple mappage d'objets vers des tables.
Beaucoup de gens considèrent une ligne dans une table de base de données comme une entité (j'ai passé de nombreuses années à réfléchir en ces termes), mais une ligne n'est pas une entité. C'est une proposition. Une relation de base de données (c.-à-d., Table) représente un énoncé 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 héritage, association, agrégation ou complètement non affiliés) peuvent être partiellement stockés dans une seule relation.
Il est préférable de vous demander quels faits voulez-vous stocker, à quelles questions voulez-vous des réponses, quels rapports voulez-vous générer.
Une fois la conception de base de données appropriée créée, il suffit 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 mémoriser le fait que Jane Doe a réservé une chambre au Seaview Inn du 10 au 12 avril. Est-ce un attribut de l'entité cliente? Est-ce un attribut de l'entité hôtelière? S'agit-il d'une entité de réservation avec des propriétés qui incluent le client et l'hôtel? Il peut s'agir de tout ou partie de ces éléments dans un système orienté objet. Dans une base de données, ce n'est rien de tout cela. C'est simplement 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ôtelière. Ce sont les objets qui exposeraient ces propriétés dans leurs API. (Cependant, de toute évidence, 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, conceptuellement, il n'est pas nécessaire de s'embêter avec une autre «entité».
C'est donc 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 appropriée est construite. Et une fois qu'elle est correctement conçue, les requêtes utiles qui n'étaient pas envisagées pendant la phase de conception peuvent être facilement construites, car tous les faits nécessaires pour répondre à ces requêtes sont à leur place.