Was ist bei der Verwendung eines ORM in Ihrem Datenbankdesign zu beachten?


19

Worauf sollten Sie beim Datenbankdesign achten, wenn Sie wissen, dass der Zugriff auf die Datenbank mit einer Object Relational Mapper- Wikipedia (ORM) möglich ist ? Siehe auch Entity Framework NHibernate oder LLBLGenPro.

Als Beispiel nehme ich das 2100-Parameterlimit beim RPC-Aufruf von SqlServer zur Kenntnis. Dies ist ein Problem bei der Verwendung von LLBLgen und beim Verknüpfen von Tabellen, wenn Verbundprimärschlüssel verwendet wurden. Informationen zu Verbundschlüsseln finden Sie im MSDN-Artikel .


4
Keine Beleidigung, sondern "Tabellen mit mehr als 1 Primärschlüssel verbinden". Dies definiert eine der Grundregeln einer Tabelle neu, eine einzelne PK pro Tabelle. Was genau hast du gemeint?
Marian

Wie erreicht dies die 2100-Parametergrenze? Haben Sie Tabellen mit so vielen Spalten? Ich nehme auch an, Sie meinen "Objekt-Relationales Mapping" und nicht "Objekt-Rollenmodellierung"
John Saunders

Das 2100-Parameterlimit ist manchmal ein Problem, wenn Sie eine große Liste von Werten an ein SQL-IN (LINQ array.Contains (member)) übergeben. Das hat jedoch nichts mit Datenbankdesign zu tun. das ist eher ein Problem mit dem Abfragemuster. Die einfachste Problemumgehung für ORMs, die darunter "leiden", besteht darin, die Liste in eine [permanente] temporäre Tabelle einzufügen und sich dieser anzuschließen und / oder eine Unterabfrage zu verwenden, die die Elemente auswählt, von denen sie stammen. (Das Übergeben von Tausenden von Elementen an ein SQL-IN ist im Allgemeinen ohnehin schlecht, unabhängig davon, ob Sie einen OR-Mapper verwenden oder nicht).
KristoferA

@ John, ja Object Relational Mapping
BozoJoe

4
@BozoJoe: Eine Tabelle kann per Definition nur einen Primärschlüssel haben. Es gibt kein DBMS, mit dem Sie mehr als einen Primärschlüssel für eine einzelne Tabelle definieren können.
a_horse_with_no_name

Antworten:


17

Gehen Sie durch Standardnormalisierungstechniken, hauptsächlich zur 3. Normalform. Einige ORMs können die auf Datenbankebene definierten Beziehungen übernehmen, sodass Sie nicht manuell vorgehen müssen.

Ich würde wirklich in die andere Richtung gehen und fragen, was ich über ORMs wissen sollte. Stellen Sie sicher, dass Sie Folgendes wissen: - Wie kann ich die Abfragen profilieren? - Wie kann ich den ORM überschreiben und meine eigene Abfrage schreiben? - Kann ich stattdessen gespeicherte Procs verwenden?

Die Datenbank sollte ORM-unabhängig sein, da sie höchstwahrscheinlich die App überdauert.


+1: "Die Datenbank sollte ORM-unabhängig sein". Halten Sie sich an die Standards für Datenbankdesign und gute ORMs werden auch glücklich sein.
MicSim

12
  1. Lassen Sie den ORM niemals das Schema erstellen oder aktualisieren. Verwenden Sie immer das generierte SQL als Vorlage, aber gehen Sie es durch, bevor Sie die Änderung vornehmen.

  2. Seien Sie sich bewusst, was Ihr ORM nicht kann. Django unterstützte eine Weile keine Gruppe durch das ORM, was eine Qual war (immer noch macht Legacy-Systemen Spaß!). Daher ist es für den DBA ein Muss, sich der Einschränkungen des ORM bewusst zu sein, auch wenn er nicht derjenige ist, der den Code für den ORM schreibt

  3. Nehmen Sie regelmäßig Ihre langsamen Protokolle zur Hand, fassen Sie sie in mysqlslowlog zusammen und schauen Sie sich die Top 10 an. Grundsätzlich werden Ihnen die Abfragen angezeigt, die insgesamt die meiste Zeit in Anspruch genommen haben. Eine Abfrage, die nur durchschnittlich 1 Sekunde dauerte, aber im letzten Monat 50.000 Mal ausgeführt wurde, sticht in diesem Gesamtbericht hervor wie ein Daumenschmerzen;)

Ich würde nicht sagen, dass es so extrem ist, den ORM komplett zu löschen. Wenn Ihre Entwickler, die den ORM verwenden, keine DBAs sind, schreiben sie wahrscheinlich SQL, das genauso schlecht oder schlechter ist als der ORM. So wird es irgendwann auf den DBA fallen, zu schauen, was los ist.


1
Und überlegen Sie, ob Sie eine sehr komplexe Logik in einen gespeicherten Prozess einfügen möchten. ORMs können gespeicherte Prozesse aufrufen, und für sehr komplexe Logik ist es einfacher, die Leistung eines Prozesses zu optimieren.
HLGEM

7

Es gibt ein paar Dinge, die ich sofort an einer älteren Datenbank bemerke, die sich von einer Datenbank unterscheidet, die von ORMs wie Sequel und ActiveRecord for Ruby erstellt wurde.

  1. Die Verwendung eines Primärschlüssels in allen aufgerufenen Tabellen 'id'. Ja, das kann überschrieben werden, ist aber iddie Standardeinstellung.
  2. Die Verwendung von Pluralnamen für die Tabellen.
  3. Die Verwendung von Unterstrichen ("snakecase") zum Trennen der Wörter, wodurch der beschreibende Name der Tabellen und Felder erstellt wird.
  4. Die Verwendung von _idan Fremdschlüssel angehängten: Das Layout ist in der Regel ähnlich referenced_table_id.

Ich habe mein SQL jahrelang von Hand geschrieben, weil ich keinem ORM vertraut habe, aber in den letzten zwei oder drei Jahren habe ich angefangen, die beiden zuvor erwähnten ORMs zu verwenden, und bin beeindruckt, wie gut sie in vorhandene Datenbanken integriert sind. und wie gut sie eine Datenbank entschlüsseln können, wenn ihre Konventionen befolgt werden, oder ich nehme mir die Zeit, ihnen die Hinweise zu geben, die zum Verständnis einer alten Datenbank erforderlich sind.

Ich weiß nicht, ob es gemeinsame Richtlinien für das Entwerfen von Schemas gibt, die mit ORMs gut funktionieren, aber ich denke, wir alle würden davon profitieren, wenn wir einige Standards hätten. Es gibt definitiv eine Zeit und einen Ort für ein ORM, besonders wenn Sie eine gute OO-Sprache verwenden und einen engen Zeitplan haben.


1
Zu Ihrer Information: Es gibt Tools zum Behandeln von Unterschieden bei Namenskonventionen für viele OP-Mapper. Ich habe ein Add-In für Visual Studio, das das für Entity Framework und Linq-to-SQL mit regelbasierter Benennung erledigt. Weitere Informationen hierzu finden Sie unter huagati.com/dbmltools .
KristoferA

1
ID ist ein SQL-Antipattern zur Benennung des ID-Feldes und sollte nicht verwendet werden.
HLGEM

Möchtest du erklären, warum? Wie gehen wir mit Beziehungen zwischen Tabellen um, wenn wir Nachschlagen wie Eins-zu-Viele und Viele-zu-Eins benötigen? In den ORMs, die ich verwende, wird die Nichtverwendung von ID definitiv dem Fluss widersprechen.
der Blechmann

2

Es hängt (:)) ein wenig davon ab, welchen OR-Mapper Sie verwenden. Informieren Sie sich daher, welche DB-Funktionen der betreffende OR-Mapper unterstützt bzw. nicht unterstützt.

Zum Beispiel unterstützen die OR-Mapper von Microsoft nicht alle integrierten SQL Server-Datentypen, und einige der neueren / erweiterten TSQL-Funktionen (rekursive Abfragen, Optimierungshinweise usw.) werden nicht unterstützt.

Theoretisch sollte ein guter OP-Mapper flexibel genug sein, um ein gut gestaltetes relationales Datenbankschema einem guten Objektmodell zuzuordnen. In Wirklichkeit haben wir noch ein bisschen Zeit, bis alle Teile des Puzzles vorhanden sind. Obwohl viele OP-Mapper erweiterte Zuordnungen unterstützen, geht dies häufig zu Lasten komplexer Abfragen und Leistungsprobleme.

Um eine gute Datenbankleistung zu erzielen (und die Integrität der Datenbank zu erhalten :)), sollten Sie beim Entwurf von DB-Schemas weiterhin die empfohlenen Vorgehensweisen befolgen. Zuerst normalisieren und wo nötig denormalisieren. Auf der Codeseite sollten Sie Ihr Objektmodell nicht übertreiben . Auch wenn der OR-Mapper komplexe Vererbungsmodelle und Entitäten unterstützt, die viele Tabellen zusammenführen, besteht die Gefahr, dass Sie Probleme mit übermäßig komplexen Abfragen in der Datenbank usw. haben. Profil, Profil, Profil und nicht nur das ORM generierte Abfragen für selbstverständlich. Beachten Sie, dass vom OR-Mapper generierte Abfragen oft genau wie normale SQL-Abfragen optimiert werden können und dass zwei funktional äquivalente Abfragen auf der Objektseite (z. B. Linq-Abfragen) manchmal zu sehr unterschiedlichen SQL-Abfragen führen können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.