Wie gehen Sie mit dem Datenbankdesign um? [geschlossen]

14

Ich bin hauptsächlich ein Webentwickler und ich habe ein paar persönliche Projekte, die ich starten möchte.

Eine Sache, die mich nervt, ist das Datenbankdesign. Ich habe in der Schule DB-Normalisierung und dergleichen durchgemacht, aber es ist ein paar Jahre her und ich hatte nie Erfahrung mit relationalem Datenbankdesign außer in der Schule.

Wie nähern Sie sich einer Datenbank aus der Perspektive einer Web-App? Wie fängst du an und worauf achtest du? Was sind Flaggen zur Vorsicht?

bron
quelle
8
Gutes Datenbankdesign für Web-Apps ist dasselbe wie gutes Datenbankdesign für jede App. Es gibt viele Einführungsbücher, die die Grundlagen gut vermitteln.
Robert Harvey
1
@harvey Haben Sie Bücher, die Sie vielleicht empfehlen möchten?
Bron

Antworten:

14

Das beste Buch, das ich je in Bezug auf Datenbankdesign gekauft habe, war Database Design for Mere Mortals von Michael Hernandez ISBN: 0-201-69471-9. Amazon Listing Mir ist aufgefallen, dass er eine dritte Ausgabe hat.

Link zur dritten Ausgabe

Er führt Sie durch den gesamten Prozess (von Anfang bis Ende) des Entwurfs einer Datenbank. Ich empfehle Ihnen, mit diesem Buch zu beginnen.

Sie müssen lernen, Dinge in Gruppen oder Blöcken zu betrachten. Das Datenbankdesign hat ebenso wie die Programmierung einfache Bausteine. Wenn Sie sich mit diesen einfachen Bausteinen vertraut machen, können Sie jedes Datenbankdesign angehen.

In der Programmierung haben Sie:

  • If Konstrukte
  • Wenn sonst Konstrukte
  • Do While-Schleifen
  • Do Until-Schleifen
  • Case-Konstrukte

Mit Datenbanken haben Sie:

  • Datentabellen
  • Nachschlagetabellen
  • Eins zu Eins Beziehungen
  • Eine bis viele Beziehungen
  • Viele zu vielen Beziehungen
  • Primärschlüssel
  • Fremde Schlüssel

Je einfacher Sie Dinge machen, desto besser. Eine Datenbank ist nichts anderes als ein Ort, an dem Sie Daten in Cubbie-Löcher stecken. Beginnen Sie, indem Sie herausfinden, was diese Würfelöffnungen sind und welche Art von Material Sie darin haben möchten.

Sie werden nie das perfekte Datenbankdesign erstellen, wenn Sie es zum ersten Mal versuchen. Das ist ein Fakt. Ihr Design wird während des Prozesses mehrere Verfeinerungen durchlaufen. Manchmal werden die Dinge nicht offensichtlich, bis Sie anfangen, Daten einzugeben, und dann haben Sie einen ah ha Moment.

Das Web bringt seine eigenen Herausforderungen mit sich. Bandbreitenprobleme. Staatenlosigkeit. Fehlerhafte Daten von Prozessen, die beginnen, aber nie abgeschlossen werden.

Michael Riley - AKA Gunny
quelle
11

Ich mache sowohl objektorientiertes Programmieren als auch (meistens transaktionales, aber etwas OLAP) Datenbankdesign, und für meine Umstände gibt es viele wiederkehrende Themen (zumindest mit OLTP).

Das Üben der 3nf-Normalisierung hilft mir, eine Variante des Prinzips der Einzelverantwortung zu üben. Eine Tabelle sollte ein Konzept in Ihrem System darstellen - und Konzepte sollten sich so aufeinander beziehen, dass sie versuchen, die Realität nachzuahmen. Wenn ich zum Beispiel ein System aufbaue, in dem ein Kunde 0 oder viele Aktivitäten haben kann, dann erstelle ich eine Kundentabelle und eine Aktivitätstabelle. Die Aktivitätstabelle hat eine Fremdschlüsselbeziehung zur Kundentabelle. Wenn ich gespeicherte Prozeduren erstelle, stelle ich sicher, dass ein Outer-Join verwendet wird, um dem Kunden und der Aktivität beizutreten, da die Geschäftsanforderung, dass ein Kunde über 0 Aktivitäten verfügen kann.

Ich achte auch auf Erweiterungsmöglichkeiten, indem ich Bridge- (Link-) Tabellen verwende. Wenn ich zum Beispiel versuchen würde, eine Geschäftsregel darzustellen, bei der ein Buch eine unbegrenzte (variable) Anzahl von Autoren haben könnte, würde ich eine Buchtabelle, eine Autorentabelle und eine Brücken- / Verknüpfungstabelle erstellen, die Fremdschlüsselverweise auf beide enthält Buch und Autor.

Außerdem verwende ich für alle Tabellen Ersatzschlüssel (normalerweise automatisch inkrementierende Identitätsspalten, aber möglicherweise Guids - der Nachteil von Guids im Code ist, dass sie mehr Speicherplatz beanspruchen als eine einfache Ganzzahl) Lookups (außer bei Bridge- / Link-Tabellen). Standardmäßig erstelle ich auch Indizes für gemeinsame Fremdschlüsselspalten und überprüfe von Zeit zu Zeit gespeicherte Prozeduren / Systemabfragen, um die Indizierungsstrategien zu optimieren. Eine andere von mir verwendete Indizierungsstrategie besteht darin, nach Stellen in meinem Code zu suchen, an denen ich eine Sammlung basierend auf einer Suchspalte erstelle, und den Suchspalten entsprechende Indizes hinzuzufügen.

Tim Claason
quelle
10

Zuerst entwerfe ich mein Datenbankschema und erst dann erstelle ich daraus mit einem ORM die Objekte. So bin ich ein bisschen altmodisch; Ich vertraue nicht darauf, dass ORMs ein intelligentes, effizientes Datenbankschema erstellen. Das ist die Arbeit des Menschen und gehört zum Handwerk des Softwaredesigns.

Robert Harvey
quelle
1
Der ORM erfindet Ihr Schema nicht. Es baut es auf dem auf, was Sie in Ihren Objekten getan haben. Wenn Sie Ihre Objekte aus Ihrem Schema erstellen, delegieren Sie tatsächlich eine wichtige Aufgabe an Ihr dummes ORM.
1
@ Pierre303 Das Schema basiert auf den Programmierregeln in diesem ORM, die möglicherweise nicht perfekt zu Ihrer Situation / Ihrem Design passen. Möglicherweise wird eine suboptimale Datenbank erstellt. Ich habe einige schreckliche Dinge gesehen, die aus ORMs hervorgegangen sind, sogar auf der Abfrageebene.
m4tt1mus
@ Pierre303, ich denke dieser Kommentar zeigt genau, warum es eine schlechte Idee ist, aus dem ORm eine richtig gestaltete Datenbank zu erstellen, die nicht direkt mit den in einer Anwendung verwendeten Objekten übereinstimmen sollte. Es gibt oft viele andere Dinge, die zum richtigen Entwerfen einer Datenbank erforderlich sind, die dies nicht berücksichtigen und die nicht berücksichtigen, welche Strukturen für die Datenbank und nicht für die Anwendung am effizientesten sind.
HLGEM
@HLGEM: Sie können möglicherweise nicht mit fortgeschrittenen ORMs wie Hibernate gearbeitet haben und diesen Kommentar schreiben
OH, wie geht der Orm mit Audits und Feldern um, die von anderen Dingen als Ihrer Anwendung benötigt werden?
HLGEM,
5

Ich fand Bill Karwins Buch, SQL Antipatterns , sehr nützlich für die Datenbankplanung. Der umfassendste Punkt ist, dass die Datenbank viele Möglichkeiten zum Schutz der Integrität und Aussagekraft Ihrer Daten bietet und dass es ein häufiger Fehler von Designern ist, diese Funktionen aus verschiedenen verlockenden Gründen zu ignorieren. Es lohnt sich, diese Probleme von Anfang an zu berücksichtigen und sie über das gesamte Design informieren zu lassen, und es lohnt sich, später zu versuchen, Risse zu beseitigen.

Ich bevorzuge die Verwendung einer Datenbank mit umfassenden Einschränkungen, um die Geschäftslogik und -integrität auf Datenbankebene durchzusetzen. Oft sehe ich die Datenbank als Anwendung und alles, was darauf zugreift, als bloße Schnittstelle. Dies macht das Hinzufügen anderer "Schnittstellen" zu einer angenehmeren und einfacheren Erfahrung und hat positive Vorteile für die Sicherheit.

Ich denke auch, dass es wichtig ist, die Struktur der Datenbank als sich ändernde Entität zu betrachten, anstatt davon auszugehen, dass Sie sie einpacken und versiegeln müssen, bevor Sie etwas anderes starten. Sie sollten Änderungen einplanen und die Datenbank in Ihr Versionierungssystem aufnehmen. Dazu gibt es einen schönen Aufsatz: Evolutionary Database Design von Martin Fowler & Pramod Sadalage (und auch ein ganzes Buch zu diesem Thema von Sadalage, das ich aber nicht gelesen habe).

Schließlich sind periphere Probleme mit Benutzerkonten / Rollen, Hardware / Standort / Verbindung des Hosts usw. wichtig und werden manchmal übersehen. Beachten Sie dies auch bei der Planung.

Ian Mackinnon
quelle
5

Das Datenbankdesign kann nicht vollständig durchgeführt werden, ohne zu berücksichtigen, wie die Daten verwendet werden. Hier ist eine kurze Liste der Schritte:

  • Schreiben Sie kurze Sätze, die die Beziehung zwischen Entitäten festhalten
  • Zeichnen Sie ein Entity-Relationship-Diagramm, das die Sätze darstellt
  • Erstellen Sie ein normalisiertes logisches Datenmodell aus dem ER-Diagramm
  • Erstellen Sie eine CRUD-Matrix für Anwendungen und Entitäten
  • Verwenden Sie die Matrix, um die Abdeckung des Lebenszyklus jeder Entität zu überprüfen
  • Extrahieren Sie Teilschemata für jede Anwendung
  • Untersuchen Sie die Navigationspfade über den Teilschemata für jede Haupt- / CRUD-Operation
  • Berücksichtigen Sie die erforderlichen Berichte
  • Entwerfen des physischen Datenmodells auf der Grundlage all dieser Punkte; Denormalisieren, partitionieren und verwenden Sie gegebenenfalls Sternschemata
Steven A. Lowe
quelle
Sie sollten besser sicherstellen, dass Sie den Bericht richtig erstellen, wenn Sie die Leute zufrieden stellen möchten, die die Schecks ausstellen.
JeffO
3

Um eine Datenbank erfolgreich zu entwerfen, müssen Sie zunächst einige Dinge berücksichtigen:

  • Welche Daten muss ich speichern und in welcher Beziehung stehen sie zu den anderen Daten, die ich speichere? Wie müssen sich diese Daten im Laufe der Zeit ändern? Muss ich in der Lage sein, einen Schnappschuss rechtzeitig zu sehen (dieser Auftrag von 2009) oder brauche ich nur das, was aktuell ist (nur aktive Benutzer)?
  • Wie kann ich sicherstellen, dass meine Daten aussagekräftig sind und über einen längeren Zeitraum aussagekräftig bleiben (Datenintegrität)?
  • Wie kann ich sicherstellen, dass der Datenzugriff schnell ist?
  • Wie kann ich meine Daten schützen?

Bevor Sie mit dem Entwurf einer Datenbank beginnen, müssen Sie sich zunächst mit der Normalisierung und den Funktionen einer Datenbank vertraut machen, mit denen die Integrität der Daten gewährleistet wird.

Dann müssen Sie die Leistungsoptimierung verstehen. Dies ist nicht verfrüht, die Leistung ist der kritische Fehlerpunkt der meisten Datenbanken, und es ist sehr schwierig, sie zu beheben, sobald Sie über Millionen von Datensätzen verfügen.

Und schließlich müssen Sie wissen, wie Sie die Daten schützen und welche Daten gesichert werden müssen und welche internen Kontrollen Sie benötigen, um sicherzustellen, dass die Daten nicht in böswilliger Absicht geändert werden, oder um sicherzustellen, dass Sie die Änderungen im Laufe der Zeit nachverfolgen können, um herauszufinden, wer und wann Es wurde eine Änderung vorgenommen, um auf frühere Versionen zurückgreifen zu können.

Es ist auch hilfreich, ein wenig über das Refactoring von Datenbanken zu lesen, bevor Sie beginnen, da es später ein Refactoring geben muss. Außerdem ist es hilfreich zu wissen, wie Sie die Dinge einrichten, damit Sie das Refactoring so einfach wie möglich gestalten können.

Im Allgemeinen überleben die Daten die Anwendung um viele Jahre, sie sind das Herzstück der Anwendung und sollten nicht als ein dummer Datenspeicher betrachtet werden, der größtenteils irrelevant ist.

HLGEM
quelle
2

Im Allgemeinen ist ein gutes Datenbankdesign ein gutes Datenbankdesign - die größere Frage für die Webnutzung wird sein, wie Sie auf die Daten zugreifen und Dinge verwalten, von denen man annimmt, dass sie einen Zustand erfordern, den das Web im Grunde nicht hat.

Wenn ich darüber nachdenke, basiert mein Ansatz auf ziemlich viel Erfahrung ... aber egal, ob Sie mit einem Schema oder Objekten beginnen, Sie versuchen tatsächlich, dasselbe zu tun, dh ein brauchbares Modell Ihrer Daten zu erstellen - für eine beträchtliche Anzahl von Projekte, bei denen es wahrscheinlich eine ziemlich direkte Beziehung zwischen Modell und Schema gibt (nicht in allen Fällen und wahrscheinlich nicht für alle Tabellen / Objekte). Es ist also wirklich eine Sache, ein anständiges Modell zu erstellen, das dort beginnt, wo Sie sich wohl fühlen und von dort aus arbeiten.

In Bezug auf das Erstellen eines anständigen Modells - @Tim hat es für Datenbanken und das Erstellen Ihres Objektmodells wird im Grunde genommen weitgehend ähnlich sein - was ist einzigartig, was ist eine Hierarchie, wo gibt es viele zu viele Beziehungen usw. dann, wie auch immer Sie Holen Sie sich eine Datenbank, stellen Sie sicher, dass Sie alle guten Dinge tun.

Stellen Sie außerdem sicher, dass Sie Skripts oder ddl im Code haben, damit Sie das Schema von Grund auf neu erstellen und aktualisieren können, wenn Sie Änderungen vornehmen (ddl im Code ist meine bevorzugte Methode - ich habe ein System und es funktioniert).

Murph
quelle
2

Ich beginne mit einem großen Whiteboard und einer Reihe verschiedener Stiftfarben. Unterschiedliche Farben bedeuten unterschiedliche Dinge. Und ich fange gerade an zu zeichnen. Normalerweise zeichne ich Dinge, die eindeutig in Schwarz sind, Dinge, die wahrscheinlich in Blau sind, und Dinge, die unwahrscheinlich in Grün sind. Rot steht für wichtige Hinweise. Ich lösche und zeichne reichlich neu. Ich überlege, welche Art von Dingen ich abfragen muss und stelle sicher, dass das Modell dies unterstützt. Wenn nicht, werde ich bis dahin optimieren.

Wenn das Modell zu groß wird, verschiebe ich es schließlich nach Visio und bearbeite Teile wieder auf dem Whiteboard.

Zuletzt denke ich über Erweiterungspunkte nach. Der größte Fehler, den die meisten Leute machen, ist, ihre Datenbank zu entwerfen und dann "Ich bin fertig mit der Datenbank" zu sagen und fortzufahren. Sie sind noch nie mit der Datenbank fertig. Jede einzelne Änderungsanforderung, die Sie erhalten, wird wahrscheinlich bis zu dieser Stufe reichen. Überlegen Sie sich also, wie Sie etwas hinzufügen können. Überlegen Sie, welche Arten von Anforderungen wahrscheinlich sind, und prüfen Sie, ob Sie sie einbinden können. Wenn Sie überhaupt nicht an die Erweiterbarkeit denken, werden Sie eine hohe Konstruktionsschuld haben, wenn diese Änderungsanforderungen auftreten.

Was "SQL, dann ORM" oder umgekehrt betrifft, liegt ganz bei Ihnen. Stellen Sie einfach sicher, dass Ihr Modell zuerst eine gute Grundlage bildet.

Hounshell
quelle
Tricky one this ... Ich stimme zu, dass man die Zukunft des Projekts bedenken muss (und der Rest ist gut, daher upvote), aber ich hatte mehr als einmal Datenbanken, die Felder und sogar Tabellen haben, die am Ende nie benutzt werden, weil Ich habe in einer Zukunft entworfen, die nie passiert ist. Ich tendiere jetzt stark zum Bauen, um das vorliegende Problem zu lösen - aber (und dies ist meine Karte, mit der ich das Gefängnis verlassen kann) ich stelle sicher, dass ich einen Mechanismus habe, mit dem ich das Schema einfach aktualisieren kann (und da ich dies von hier aus tue) Code kann bei Bedarf komplexe Manipulationen in den Prozess anwenden)
Murph
Genau das wollte ich vermitteln. Bauen Sie, was Sie brauchen, nichts weiter. Aber wenn Sie später keine Erweiterung planen, waren Sie schon einmal im Rush-Hour-Verkehr in der Bay Area? Das ist ein perfektes Beispiel dafür, was passiert, wenn Sie nicht genau überlegen, wie Sie möglicherweise expandieren müssen.
Hounshell
Und um die Farben besser zu verdeutlichen: Schwarz ist für Dinge, von denen ich weiß, dass sie richtig sind. Normalerweise sind einfache Dinge, für die es kein anderes Schema gibt, sinnvoll. Blau ist für Dinge, die ich vielleicht etwas umstrukturieren möchte. Dinge, die wahrscheinlich richtig sind, aber ich kann löschen. Grün ist für Dinge, bei denen ich wirklich ein Brainstorming mache und die ich mit ziemlicher Wahrscheinlichkeit ausradiere.
Hounshell
1

Ich entwerfe zuerst Objekte und erst dann benutze ich ein ORM (wie z. B. nHibernate), um das Schema zu erstellen. Es gibt mir viel mehr Flexibilität als das Inverse.

Der nächste Schritt ist die Optimierung des generierten Schemas.

Es ist lange her, dass ich ein Projekt gesehen habe, in dem die Datenbanktabellen zuerst entworfen wurden.


quelle
Ja. Wenn Sie kein DB-Guru sind, halten Sie die Datenbank so einfach wie möglich. Es sollte nur gut genug sein, um die App zu unterstützen. Die Voroptimierung ist schlecht. Eine Voroptimierung, wenn Sie nicht wissen, was Sie tun, ist schrecklich. Wenn Sie auf Probleme stoßen (und wahrscheinlich auch nicht), ziehen Sie einen echten Experten hinzu.
ElGringoGrande
1
@ElGringoGrande Wenn Sie kein Dbguru sind, haben Sie kein Geschäft damit, eine Datenbank für eine andere als die rudimetärste Anwendung zu entwerfen. Wenn es mehr als 10 Tabellen benötigt und nicht mehr als 100000 Datensätze enthält und Sie keinen professionellen Datenbankdesigner haben, dann machen Sie es falsch.
HLGEM
Na Mist. Ich habe eine Datenbank mit mehr als 160 Tabellen und Millionen von Zeilen entworfen (die größte Tabelle verfügt über etwas mehr als eine Million Datensätze für einen mittelgroßen Kunden. Der größte Kunde verfügt über mehr als 5 Millionen). Die meisten Kunden haben mehrere hundert gleichzeitige Benutzer und die größten über zweitausend Benutzer. Und ich bin kein DB Guru, noch haben wir einen eingestellt. Ich habe mehrere dieser DB-Designs für verschiedene Anwendungen erstellt. Junge, habe ich es vermasselt?
ElGringoGrande
1
ElGringoGrande: Wenn Sie solche Datenbanken mit Hunderten von gleichzeitigen Benutzern und Millionen von Zeilen in den Tabellen entworfen haben und die Benutzer zufrieden sind, dann sind Sie db-guru. Vielleicht hast du es noch nicht gemerkt.
Ypercubeᵀᴹ
1

Nur wenige Dinge, die bisher von anderen Stipendiaten nicht ausdrücklich erwähnt wurden:

  • Es ist am besten, das Datenbankdesign von jemandem ausführen zu lassen, der professionell ist. Natürlich ist es in Ordnung zu lernen, aber ich würde nicht empfehlen, ein mittleres oder großes Modell zu erstellen, wenn man sich mit Modellierung oder Datenbankdesign nicht auskennt. Der Grund dafür ist, dass die Kosten für ein falsches Design normalerweise sehr hoch sind.

  • Kennen Sie die Systemziele und Benutzeranforderungen gut. Ohne die Anforderungen zu kennen, können Sie nicht das richtige Datenmodell entwerfen.

  • Wissen Sie, welcher Code in Programmen zu tun ist und welchen Code die Datenbank bearbeiten soll. Dies ist erforderlich, damit Sie die Datenspalte auf Null, nicht auf Null usw. einstellen können. Dies ist auch erforderlich, damit Sie Ihren RI korrekt angeben können.

  • Bestimmen Sie Ihre Primärschlüssel gut. Nimm einfache Schlüssel, wenn du kannst.

  • Berücksichtigen Sie die Integrationsanforderungen für andere Anwendungen.

  • Ziehen Sie die Verwendung universeller Datenmodelle in Betracht und befolgen Sie die Industriestandards bei der Benennung und Größe der Datenspalten.

  • Denken Sie an zukünftige Bedürfnisse (wenn bekannt und falls zutreffend)

  • Lassen Sie Ihren Modus von anderen überprüfen.

  • Verwenden Sie ein Werkzeug zur Modellierung - entweder ein ERD-Werkzeug oder ein UML-Werkzeug.

  • Überprüfen und verstehen Sie den generierten DDL-Code. Nimm es nicht für selbstverständlich.

Keine Chance
quelle