Das richtige Datenbankdesign ist nichts anderes als das richtige Objektdesign.
Wenn Sie die Datenbank nur für die Serialisierung Ihrer Objekte verwenden möchten (z. B. Berichte, Abfragen, Verwendung mehrerer Anwendungen, Business Intelligence usw.), empfehle ich keine einfache Zuordnung von Objekten zu Tabellen.
Viele Leute denken an eine Zeile in einer Datenbanktabelle als eine Entität (ich habe viele Jahre damit verbracht, in diesen Begriffen zu denken), aber eine Zeile ist keine Entität. Es ist ein Satz. Eine Datenbankbeziehung (dh eine Tabelle) repräsentiert eine Tatsachenaussage über die Welt. Das Vorhandensein der Zeile zeigt an, dass die Tatsache wahr ist (und umgekehrt zeigt ihre Abwesenheit an, dass die Tatsache falsch ist).
Mit diesem Verständnis können Sie sehen, dass ein einzelner Typ in einem objektorientierten Programm in einem Dutzend verschiedener Beziehungen gespeichert werden kann. Und eine Vielzahl von Typen (durch Vererbung, Assoziation, Aggregation oder völlig unabhängig verbunden) können teilweise in einer einzigen Beziehung gespeichert werden.
Fragen Sie sich am besten, welche Fakten Sie speichern möchten, auf welche Fragen Sie Antworten wünschen und welche Berichte Sie erstellen möchten.
Sobald das richtige DB-Design erstellt wurde, können Sie ganz einfach Abfragen / Ansichten erstellen, mit denen Sie Ihre Objekte für diese Beziehungen serialisieren können.
Beispiel:
In einem Hotelbuchungssystem müssen Sie möglicherweise die Tatsache speichern, dass Jane Doe vom 10. bis 12. April ein Zimmer im Seaview Inn reserviert hat. Ist das ein Attribut der Kundenentität? Ist es ein Attribut der Hoteleinheit? Ist es eine Reservierungseinheit mit Eigenschaften, die Kunden und Hotel umfassen? Es könnten einige oder alle dieser Dinge in einem objektorientierten System sein. In einer Datenbank ist dies keines dieser Dinge. Es ist einfach eine bloße Tatsache.
Berücksichtigen Sie die folgenden beiden Abfragen, um den Unterschied zu erkennen. (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 Kundenentität und die Abfrage (2) ein Attribut der Hotelentität. Dies sind die Objekte, die diese Eigenschaften in ihren APIs verfügbar machen würden. (Offensichtlich können die internen Mechanismen, mit denen diese Werte erhalten werden, Verweise auf andere Objekte beinhalten.)
In einem relationalen Datenbanksystem würden beide Abfragen die Reservierungsbeziehung untersuchen, um ihre Nummern zu erhalten, und konzeptionell besteht keine Notwendigkeit, sich mit einer anderen "Entität" zu befassen.
Durch den Versuch, Fakten über die Welt zu speichern, anstatt zu versuchen, Entitäten mit Attributen zu speichern, wird eine ordnungsgemäße relationale Datenbank erstellt. Und sobald es richtig entworfen wurde, können nützliche Abfragen, die während der Entwurfsphase ungeahnt waren, leicht erstellt werden, da sich alle Fakten, die zur Erfüllung dieser Abfragen erforderlich sind, an den richtigen Stellen befinden.