Vor kurzem habe ich angefangen, an einem Legacy-System zu arbeiten. Die Leute, die es entwickelt haben, kamen auf die Idee, eine Liste von Zeichenfolgen in einem einzigen Feld der Datenbanktabelle zu speichern. Nehmen wir an, es handelt sich um eine Kennung für ein Objekt, das weder eine Darstellung noch Daten in der Datenbank enthält. Der Bereich dieser Kennungen wird in der Produktion relativ klein sein.
Andererseits sagt mir meine Intuition und mein "guter Designgeschmack", dass es in einer separaten Tabelle dargestellt werden sollte (ähnlich einer Tabelle, die zur Darstellung von Viele-zu-Viele-Beziehungen verwendet wird).
Ist ihr Ansatz wirklich schlecht und es wäre besser, ein Refactoring zu starten? Wenn ja, welche schlimmen Folgen kann das ursprüngliche Design in Zukunft haben? Gibt es relationale Gestaltungsprinzipien, die diesen Ansatz erklären?
Zur Antwort auf Kommentare bearbeiten:
Wie ich vermute, haben sie diesen Ansatz nicht verwendet, um ein bestimmtes Problem wie die hierarchische Strukturierung auf knifflige Weise zu lösen. Das wahrscheinlichste Szenario war der Fall, dass sie einfach unter Zeitdruck arbeiteten und neue Funktionen so schnell wie möglich implementieren mussten.
Ich bin sicher, dass das Feld zuvor einen einzelnen Wert darstellte. Sie wollten eine Funktion implementieren, um mehr als einen Wert zu speichern, und versuchten, Datenbankmigrationen zu vermeiden.
Antworten:
Das Datenmodell ist nicht normalisiert. um so zu sein, würde es eine separate Tabelle brauchen, wie Sie sagen. In dieser Hinsicht ist es keine besonders gute Datenmodellierungspraxis.
Ob dies aus gutem Grund geschehen ist oder nicht, ist schwer zu bestimmen. Möglicherweise war die Vereinfachung oder Leistung der Codierung ein Motivator. Es ist wahrscheinlich, dass das Feld ursprünglich eine Kennung enthielt, die Anforderungen sich änderten und die Entwickler keine Zeit oder Neigung hatten, neu zu faktorisieren.
Wahrscheinlich wichtiger ist, ob Sie sich selbst umgestalten sollten oder nicht. Unter ähnlichen Umständen würde ich einen solchen Fall standardmäßig nicht präventiv umgestalten. Ich würde es in Betracht ziehen, wenn eine der folgenden Bedingungen zutrifft:
Was ich tun würde und TBH würde ich empfehlen, wenn Sie eine Legacy-Anwendung übernehmen, ist ein Wiki (oder ein gleichwertiges) zu starten und Fälle wie diesen zu dokumentieren. Zum Beispiel,
Ich habe festgestellt, dass dies ein nützliches Hilfsmittel für mich ist, wenn ich in einer Codebasis arbeite und / oder zu dieser zurückkehre. Dies kann für Ihren Nachfolger auch sehr hilfreich sein, wenn er seinerseits mit dem Erlernen der Codebasis beginnen muss.
quelle
Dies würde im Allgemeinen als Verstoß gegen die Normalisierung angesehen.
Manchmal wird dies jedoch als Lösung für ein Problem verwendet, z. B. bei der hierarchischen Strukturierung, bei der eine Pfadzeichenfolge mit variabler Länge eine Struktur darstellt.
Zu den Problemen mit einer Liste von Elementen in einer einzelnen Zeichenfolge können gehören:
quelle
Es ist ein übliches Gegenmuster, dies zu tun.
Ihre Anforderungen ändern sich und jetzt benötigen Sie mehr Werte an einem Ort, an dem Sie früher nur einen benötigten. Wie ein Buch hat nur ein Autor Recht? Wer hätte ahnen können, dass ein Buch mehrere Autoren hat? Dies ist eine einfache Möglichkeit, diese Anforderungsänderung zu erfüllen, ohne Ihr Datenbankschema ändern zu müssen.
Es gibt jedoch einige Nachteile.
Bitte tun Sie dies im Grunde genommen nicht.
Grundsätzlich nehmen Sie das "relationale" in "relationale Datenbank" heraus.
quelle
Es gibt viele Argumente dafür, dass wir bereits eine schlechte Idee sind. Ich denke, es wäre fair, einige Gründe hinzuzufügen, warum es eine gute oder zumindest gute Idee wäre. Ich bin mir nicht sicher, wie viele davon in diesem speziellen Fall zutreffen, aber es scheint, dass zumindest durchgeführte Leistungshinweise relevant sind:
Wenn Sie versuchen, ein Refactoring durchzuführen, ist es immer eine gute Idee, zuerst den Grund für die vorherigen Entwurfsentscheidungen zu verstehen. Stellen Sie sicher, dass sich die Bedingungen und Anforderungen tatsächlich genug geändert haben, um die Kosten und das Risiko zu rechtfertigen.
quelle