Moin Moin!
Normalisiere die Daten. Du möchtest vermutlich eine 1:n-Beziehung aufbauen, vielleicht auch n:m.
Ich weiß, dass das der vordergründig vorhandene Knackpunkt ist. [...]
Würde ich nämlich, bezogen auf diese Spalte, die Daten normalisieren, würde ich die Datenbankin der Datenmenge maßgeblich aufblähen.
Warum soll eine Normalisierung die Daten aufblähen? Sauber durchnormalisiert jonglierst Du nur ein paar 32-Bit- oder 64-Bit-Integer durch die Gegend, und hast keine (oder kaum noch) Redundanzen.
Die Daten NICHT normalisiert zu speichern erzeugt früher oder später einen Wartbarkeitsalbtraum:
Ich quäle mich gerade mit einem alten Stück Software herum, dessen "Schöpfer" sich aus Denkfaulheit nahezu jede Normalisierung "gespart" hat. Das Ergebnis ist eine Datenbank mit riesigen Redundanzen und an sehr vielen Stellen fünffach kopiertem Programmcode (Teilweise sind ganze Module fünffach vorhanden!), wo eine normalisierte DB mit einer einfachen For- oder While-Schleife hätte bedient werden können.
Das sieht dann sinngemäß pro Routine so aus:
SELECT Produktnummer, Sollzahl_Haus_1, Istzahl_Haus_1, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_2, Istzahl_Haus_2, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_3, Istzahl_Haus_3, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_4, Istzahl_Haus_4, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_5, Istzahl_Haus_5, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
Das zieht sich so durch mehrere Megabytes Programmcode und über irgendwas zwischen 50 und 200 DB-Tabellen.
Normalisiert würde die entsprechende Routine so aussehen:
for (i=1; i<=5; i++) {
SELECT Produktnummer, Hausnummer, Sollzahl, Istzahl, ... FROM Produkte ... WHERE Hausnummer=i
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
}
Oder mit einem günstigen Problem schlicht:
SELECT Produktnummer, Hausnummer, func1(Sollzahl), func2(Istzahl), ... FROM Produkte ... GROUP BY Produktnummer, Hausnummer
Die "magische" Zahl Fünf kommt aus der Idee, die Software würde nie mehr als fünf "Häuser" bedienen, ursprünglich gab es sogar nur zwei. Heute sind es irgendwas zwischen 20 und 30 "Häuser", organisiert in Gruppen mit jeweils maximal fünf "Häusern". Natürlich sollen irgendwann alle "Häuser" in einer Gruppe stecken, und es sollen noch mehr "Häuser" dazu kommen.
Erschwerend kommt dazu, dass es über ein Jahrzehnt nicht ein Stück Dokumentation und absolut keine Historie des Codes gibt, abgesehen von einigen strukturlosen Kommentaren im Code. SCCS, CVS, SVN, VSS, git, alles Fremdworte, nie gehört, nie gesehen. Und auf Nachfragen hört man dann auch nur noch "Wieso? Das steht doch alles im Code."
Zur Eleganz des Codes des Codes sei nur gesagt: "If the Only Tool You Have is a Hammer, Then Every Problem is a Nail." Der Code macht Kopfschmerzen, insbesondere wenn man weiß, dass der Code produktiv läuft. Zum Glück ist das monatliche Schmerzensgeld ganz annehmbar.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".