Fördert ORM die De-Normalisierung von Datenbanken?

14

Sowohl Doctrine als auch Propel verwenden die Vererbung einzelner und konkreter Tabellen, um Objektbeziehungen abzubilden. Ersterer erkennt alle möglichen Felder im Klassenbaum, die einer einzelnen Tabelle zugeordnet sind, während letzterer jede Klasse einer bestimmten Tabelle zuordnet und dabei gemeinsame Felder in der Vererbungshierarchie dupliziert.

Dies erleichtert zwar den ORM-Apparat, deutet aber auf ein schlechtes Datenbankdesign hin. Sind diese schlechten Entwurfsmuster für eine Datenbank zu erzwingen?

sunwukung
quelle

Antworten:

4

Es ist unmöglich zu sagen, ob ein bestimmtes Datenbankdesign schlecht ist, ohne zu wissen, was die Anwendung tut, welche Form die Daten haben, welche Leistungserwartungen sie haben und so weiter. Während im Allgemeinen die Normalisierung (bis zu einem gewissen Grad) als bewährte Methode angesehen wird, ist es aus Performancegründen üblich, Bereiche von Datenbanken zu denormalisieren, sodass gute und schlechte Daten ohne viel mehr Daten zur Diskussion stehen, als die meisten Leute zu Beginn haben.

Fügen Sie die zahlreichen Ansätze hinzu, mit denen Objekte relationalen Zuordnungen zugeordnet werden können, und die Dinge werden noch komplexer, da die "beste" Datenbankstruktur vom spezifischen Objektmodell, der Vererbungsebene usw. abhängt.

Wenn Sie eine Einheitsgröße wählen, erzeugen ORM-Persistenzbibliotheken fast immer eine nicht optimale Datenbankstruktur für eine bestimmte Situation und verwenden einige Dinge, die für eine bestimmte Situation als schlechte Praxis angesehen werden können .

Sie könnten sicherlich einen ORM schreiben, der sich normalisiert, aber Sie würden ziemlich starke Auswirkungen auf die Leistung feststellen, da für jede Einfügung in eine Haupttabelle die verschiedenen Nachschlagetabellen durchsucht werden mussten, um festzustellen, ob Werte vorhanden waren, ob sie ihre Schlüssel erhalten haben und ob sie nicht die entsprechenden Einsätze nicht durchführen.

(Wenn Sie dies von Hand tun, können Sie einen Teil davon abkürzen, da Sie wissen, dass Sie ihnen ein Dropdown-Menü mit nur gültigen Werten angezeigt haben, sodass Sie diese Suchvorgänge nicht ausführen müssen. Sie können einfach den Schlüssel verwenden, wenn er funktioniert Um gültig zu sein, konnte der ORM diese Annahme nicht treffen, da er die Benutzeroberfläche nicht kontrolliert.)

Sie müssen sich jedoch daran erinnern, dass sie nicht darauf abzielen, die Datenbankleistung oder die Datenintegrität zu optimieren, sondern die Entwicklungsgeschwindigkeit zu optimieren . Wenn Ihnen die spezifische Struktur Ihrer Daten wichtig ist, müssen Sie entweder Ihre Objekt- / RDBMS-Zuordnungen von Hand codieren oder zumindest eine detaillierte Bewertung aller verfügbaren Bibliotheken vornehmen und diejenige auswählen, die Ihren Anforderungen am besten entspricht ( falls vorhanden).

Im Wesentlichen kommt es auf die Anforderungen und den Kompromiss zwischen gut strukturierten Daten, Datenbankleistung und Entwicklungsgeschwindigkeit an. Wie bei vielen Kompromissen kann man nicht alle drei auswählen.

Jon Hopkins
quelle
Ich würde niemals Verknüpfungen verwenden oder explizit prüfen, ob Werte in verschiedenen Nachschlagetabellen vorhanden sind. Ich würde Fremdschlüsselbeschränkungen verwenden, um dies sicherzustellen. Ich würde mir wünschen, dass ein guter ORM das Gleiche tut.
David Conrad
7

Als Faustregel gilt, modellieren Sie niemals Ihre Daten, um die Anforderungen des Entwicklers zu erfüllen (Sie können hierfür Views oder Sp verwenden, nicht jedoch das Datenmodell).

Das Datenmodell sollte auf den Geschäftsregeln der Anwendung und den Leistungsanforderungen basieren.

Idioten
quelle
6

Ich stimme nicht zu, dass ORM eine De-Normalisierung oder ein schlechtes Datenbankdesign fördert. Tatsächlich wurden die schlechtesten Datenbanken, die ich je gesehen habe, ohne ORMs erstellt. Indem es einfach ist, richtige Beziehungen basierend auf der Zeilen-ID zu erstellen, anstatt eine Beziehung basierend auf dem Wert eines zufälligen Felds zu erstellen, wird eher ein gutes Datenbankdesign gefördert.

Möglicherweise fördert es nicht die Normalisierung, aber andererseits könnte man fast sehen, dass ein ORM, in dem es einfach ist, Tabellen / Objekte und Beziehungen zu erstellen, dies ebenfalls fördert. Es ist nicht viel mehr Arbeit in einem ORM, eine "Standort" -Tabelle mit Adressen zu erstellen und Mitarbeiter mit dem Standort zu verknüpfen, anstatt die Adresse der Mitarbeitertabelle hinzuzufügen. Ohne ORM bedeutet die Trennung des Standorts jedoch, dass Sie jedes Mal, wenn Sie auf den Standort zugreifen möchten, eine Verknüpfung herstellen müssen.

Meine Antwort lautet also: Nein, das glaube ich nicht . Möglicherweise ist es umgekehrt, ein gutes ORM fördert ein gutes Datenbankdesign, zumindest für diejenigen, die wenig Erfahrung haben.

Lennart Regebro
quelle
1
Und viele ORMs können mehrere Tabellen vererben: (N) Hibernate und RoR ActiveRecord zum Beispiel.
Rsenna