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?
Antworten:
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:
Mit Datenbanken haben Sie:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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:
quelle
Um eine Datenbank erfolgreich zu entwerfen, müssen Sie zunächst einige Dinge berücksichtigen:
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.
quelle
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).
quelle
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.
quelle
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
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.
quelle