Hallo,
Ich bin schon oft auf die Schnauze gefallen, weil sich die
Anforderungen von Heute auf Morgen so starkt verändert haben,
dass eine vollständige Normalisierung von Anfang an besser
gewesen wäre.
In solchen Fällen sind die Fehler nicht im Datenbankdesign gemacht worden, sondern schon bei der Planung der gesamten Anwendung.
Wenn jemand aus einem Mini einen Geländewagen machen möchte, dann geht das nicht. Auch wenn beides 4 Räder und ein Lenkrad hat.
Erfahrung nützt da wenig, da man nicht immer von
der Vergangenheit auf die Zukunft schließen kann.
Erfahrung hilft auch dort. Man kann eine Datenbank so designen, dass sie erweitert werden kann, ohne den Kern umzugestalten.
Nichts ist schlimmer als eine Datenbank, der man anmerkt, dass sie
historisch gewachsen (also total vermurkst) ist. Ich versuche
deshalb von Anfang an alles so flexibel wie möglich zu
gestalten. Alles andere rächt sich irgendwann.
Historisch gewachsene Datenbanken sind oft nicht von den richtigen Leuten entworfen und normalisiert worden.
Ein Beispiel mal aus meiner Praxis:
In einer DB wurden Messkurven gespeichert. Eine Kurve besteht aus ca. 2000 Datenpunkten (x,y), es wurden jeweils ca .10 Kurven pro Messung ermittelt. Die Kurven mussten übereinander auf einer Webseite dargestellt werden.
Derjenige, der die DB entworfen hatte, hat die Kurvendaten in einer eigenen Tabelle gespeichert.
also: Messung 1*n Kurve 1*n Kurvenpunkte
Von der Normalisierung ist das OK.
Bei jedem Plot auf der Webseite mussten aber 20000 Datenpunkte aus der DB gezogen werden. Nachdem die Anzahl der Datenpunkte in der DB auf ca 100 Millionen gestiegen war, hat die Webseite sich mit einem Timeout verabschiedet. (Optimierungen der Tabelle und des Servers waren schon getätigt - im Rahmen des finanziell möglichen)
Lösung? De-Normalisieren. In dem Fall geht es, weil Datenpunkte entweder alle oder keiner gebraucht wird.
In der Tabelle „Kurven“ ein Blob Feld hinzufügen und die Kurvenpunkte dort als XML speichern. Tabelle „Kurvenpunkte“ löschen. Datenbank ist jetzt wieder unterbeschäftigt.
Derjenige, der die Datenbank entworfen hatte, wollte es richtig machen. Konnte sich aber nicht vorstellen welche Datenmengen dort am Ende gespeichert werden. Wenn er genug Erfahrung gehabt hätte, hätte er das 1) hinterfragt und 2) gleich einen anderen - De-Normalisierten - Ansatz gewählt.
Wie ich schon Ralf geschrieben habe. Normalisieren ist ganz, ganz wichtig. Aber eben nicht das Ende des Entwurf.
Gruss
Joey