Richtiges Datenbankdesign ist nichts anderes als richtiges Objektdesign.
Wenn Sie planen, die Datenbank für etwas anderes als die einfache Serialisierung Ihrer Objekte zu verwenden (z. B. für Berichte, Abfragen, die Verwendung mehrerer Anwendungen, Business Intelligence usw.), dann empfehle ich keine einfache Zuordnung von Objekten zu Tabellen.
Viele Menschen betrachten eine Zeile in einer Datenbanktabelle als eine Entität (ich habe viele Jahre lang in diesem Sinne gedacht), aber eine Zeile ist keine Entität. Sie ist eine Proposition. Eine Datenbankbeziehung (d. h. eine Tabelle) stellt eine Aussage über die Welt dar. Das Vorhandensein der Zeile bedeutet, dass die Tatsache wahr ist (und umgekehrt, dass ihr Fehlen bedeutet, dass die Tatsache falsch ist).
Mit diesem Verständnis können Sie erkennen, dass ein einziger Typ in einem objektorientierten Programm in einem Dutzend verschiedener Relationen gespeichert sein kann. Und eine Vielzahl von Typen (vereint durch Vererbung, Assoziation, Aggregation oder völlig unverbunden) kann teilweise in einer einzigen Relation gespeichert sein.
Am besten fragen Sie sich, welche Fakten Sie speichern wollen, welche Fragen Sie beantworten wollen, welche Berichte Sie erstellen wollen.
Sobald der richtige DB-Entwurf erstellt ist, ist es eine einfache Angelegenheit, Abfragen/Views zu erstellen, die es Ihnen ermöglichen, Ihre Objekte mit diesen Beziehungen zu serialisieren.
Beispiel:
In einem Hotelbuchungssystem müssen Sie möglicherweise die Tatsache speichern, dass Jane Doe eine Reservierung für ein Zimmer im Seaview Inn für den 10. bis 12. April hat. Ist dies ein Attribut der Kundenentität? Ist es ein Attribut der Hotelentität? Handelt es sich um eine Reservierungsentität mit Eigenschaften, die Kunde und Hotel umfassen? In einem objektorientierten System kann dies alles sein. In einer Datenbank ist es nichts von alledem. Es handelt sich einfach um eine bloße Tatsache.
Um den Unterschied zu sehen, betrachten Sie die folgenden zwei Abfragen. (1) Wie viele Hotelreservierungen hat Jane Doe für das nächste Jahr? (2) Wie viele Zimmer sind für den 10. April im Seaview Inn gebucht?
In einem objektorientierten System ist die Abfrage (1) ein Attribut der Entität "Kunde" und die Abfrage (2) ein Attribut der Entität "Hotel". Dies sind die Objekte, die diese Eigenschaften in ihren APIs offenlegen würden. (Obwohl die internen Mechanismen, mit denen diese Werte ermittelt werden, natürlich Verweise auf andere Objekte beinhalten können).
In einem relationalen Datenbanksystem würden beide Abfragen die Reservierungsbeziehung untersuchen, um ihre Nummern zu erhalten, und konzeptionell gibt es keine Notwendigkeit, sich mit einer anderen "Entität" zu beschäftigen.
Eine richtige relationale Datenbank wird also dadurch aufgebaut, dass man versucht, Fakten über die Welt zu speichern - und nicht, Entitäten mit Attributen zu speichern. Und wenn sie erst einmal richtig konzipiert ist, können nützliche Abfragen, an die man in der Entwurfsphase nicht gedacht hat, leicht erstellt werden, da alle Fakten, die zur Erfüllung dieser Abfragen benötigt werden, an ihrem richtigen Platz sind.