Hallo zusammen,
ich habe eine MySQL-Datenbank entworfen, um Verträge zu verwalten. Dabei habe ich mich natürlich an die Regeln der Normalisierung gehalten. Bei einigen Design-Entscheidungen bin ich mir aber nicht ganz sicher, ob man das nicht auch anders machen könnte. Daher würde ich mich über Eure Meinung zu ein paar grundsätzlichen Design-Fragen freuen...
Nummerierte Spalten:
Ich weiß, dass nummerierte Spalten normalerweise auf ein fehlerhaftes Design hindeuten, also wie z.B. Email1, Email2, Email3, etc.
Aber gibt es Ausnahmen, wo man derartige Konstrukte aus Gründen der Übersichtlichkeit und Einfachheit trotzdem anwendet? Als Beispiel seien hier z.B. 4 Boolean-Spalten genannt, die quasi eine Kunden-Checkliste in der Kundenmaske darstellen. Bei allen Kunden sind die Booleans anfangs False und werden nach und nach manuell auf True gesetzt. Die Anzahl der Spalten wird sich aufgrund eines gut etablierten Arbeits-Konzeptes auf absehbare Zeit auch nicht ändern(hört hört!!!) Gibt es hier einen gewissen Spielraum, innerhalb dessen man von den Normalisierungsregeln hätte abweichen dürfen, oder sollte man so etwas ohne Ausnahme niemals machen?
Zukünftige Vertragsänderungen:
Zukünftige Vertragsänderungen(z.B. Beitragshöhe, Zahlungsart, etc.). realisiere ich momentan über ausgelagerte Verlaufs-Tabellen. Die Beitragshöhen werden beispielsweise nicht in der Vertrags-Tabelle gespeichert, sondern zusammen mit einem Startdatum in einer separaten Beitrags-Tabelle für alle Kunden.
Auf diese Weise lassen sich auch zukünftige Vertragsänderungen planen, indem zusätzlich zum vom Datum her aktuell gültigen Wert ein weiterer Wert mit zukünftigem Startdatum gespeichert wird.
Wenn man davon ausgeht, dass man für jeden Vertragsparameter definitiv nie mehr als 2 Zustände gleichzeitig(Aktuell und Zukünftig) pro Vertrag zulassen möchte, wäre es dann denkbar, die notwendigen Felder einfach über mehrere Spalten(BeitragAktuell, BeitragZukuenftig, StartdatumBeitragZukuenftig) zu regeln? Dann müsste man nicht jedes mal mit Datumsfunktionen herumwurschteln, um die aktuellen und zukünftigen Konditionen zu ermitteln. Auf der anderen Seite müsste man dann aber wohl vor der Benutzung der Datenbank sicherstellen, dass für den aktuellen Tag die jeweils gültig gewordenen Vertragsänderungen in die Spalte "BeitragAktuell" verschoben werden und "StartdatumBeitragZukuenftig" gelöscht wird.
Speichern von Ausprägungen anstelle von Fremdschlüsseln:
Beim Anlegen der Verträge greife ich häufig auf Listen mit vorgegebenen Einträgen zurück, die in dafür angelegten Tabellen gespeichert werden. Die Einträge der einzelnen Dropdowns werden dabei immer wieder mal geändert/gelöscht/erweitert. Daher kann man diese über entsprechende Interfaces im BackEnd administrieren. Dabei ergibt sich das Problem, dass die Tabellen mit den Einträgen nicht einfach geändert oder gelöscht werden dürfen, da sonst die über Fremdschlüssel verknüpften Inhalte bereits angelegter Verträge nicht mehr stimmen würden.
Sollte man bei den Tabellen mit den vorgegebenen Einträgen grundsätzlich nur das Hinzufügen von Einträgen zulassen und das Löschen von Einträgen durch eine Boolean-Spalte(Aktiv/Inaktiv) ersetzen und bei Änderungen einfach den alten Wert inaktiv setzen und einen neuen aktiven erstellen? Oder sollte man besser gleich die Inhalte selbst an Stelle der Fremdschlüssel im Vertrag speichern, weil dann die Auswahl unabhängig von den bereits vorhandenen Verträgen jederzeit geändert/ergänzt/reduziert werden kann?
Die letzte Frage lässt sich auch auf das Erzeugen von Rechnungen übertragen. Hier würde ich aus Gründen der Dokumentations-Sicherheit noch viel mehr dazu tendieren, statische Daten anstelle der Fremdschlüssel zu speichern. Eventuell kann ja jemand diese Fragestellung auch im Hinblick auf Rechnungen beantworten.
Ich hoffe, das war jetzt nicht zu viel Text und bedanke mich schon mal fürs Lesen.
Viele Grüße
Injector
ich habe eine MySQL-Datenbank entworfen, um Verträge zu verwalten. Dabei habe ich mich natürlich an die Regeln der Normalisierung gehalten. Bei einigen Design-Entscheidungen bin ich mir aber nicht ganz sicher, ob man das nicht auch anders machen könnte. Daher würde ich mich über Eure Meinung zu ein paar grundsätzlichen Design-Fragen freuen...
Nummerierte Spalten:
Ich weiß, dass nummerierte Spalten normalerweise auf ein fehlerhaftes Design hindeuten, also wie z.B. Email1, Email2, Email3, etc.
Aber gibt es Ausnahmen, wo man derartige Konstrukte aus Gründen der Übersichtlichkeit und Einfachheit trotzdem anwendet? Als Beispiel seien hier z.B. 4 Boolean-Spalten genannt, die quasi eine Kunden-Checkliste in der Kundenmaske darstellen. Bei allen Kunden sind die Booleans anfangs False und werden nach und nach manuell auf True gesetzt. Die Anzahl der Spalten wird sich aufgrund eines gut etablierten Arbeits-Konzeptes auf absehbare Zeit auch nicht ändern(hört hört!!!) Gibt es hier einen gewissen Spielraum, innerhalb dessen man von den Normalisierungsregeln hätte abweichen dürfen, oder sollte man so etwas ohne Ausnahme niemals machen?
Zukünftige Vertragsänderungen:
Zukünftige Vertragsänderungen(z.B. Beitragshöhe, Zahlungsart, etc.). realisiere ich momentan über ausgelagerte Verlaufs-Tabellen. Die Beitragshöhen werden beispielsweise nicht in der Vertrags-Tabelle gespeichert, sondern zusammen mit einem Startdatum in einer separaten Beitrags-Tabelle für alle Kunden.
Auf diese Weise lassen sich auch zukünftige Vertragsänderungen planen, indem zusätzlich zum vom Datum her aktuell gültigen Wert ein weiterer Wert mit zukünftigem Startdatum gespeichert wird.
Wenn man davon ausgeht, dass man für jeden Vertragsparameter definitiv nie mehr als 2 Zustände gleichzeitig(Aktuell und Zukünftig) pro Vertrag zulassen möchte, wäre es dann denkbar, die notwendigen Felder einfach über mehrere Spalten(BeitragAktuell, BeitragZukuenftig, StartdatumBeitragZukuenftig) zu regeln? Dann müsste man nicht jedes mal mit Datumsfunktionen herumwurschteln, um die aktuellen und zukünftigen Konditionen zu ermitteln. Auf der anderen Seite müsste man dann aber wohl vor der Benutzung der Datenbank sicherstellen, dass für den aktuellen Tag die jeweils gültig gewordenen Vertragsänderungen in die Spalte "BeitragAktuell" verschoben werden und "StartdatumBeitragZukuenftig" gelöscht wird.
Speichern von Ausprägungen anstelle von Fremdschlüsseln:
Beim Anlegen der Verträge greife ich häufig auf Listen mit vorgegebenen Einträgen zurück, die in dafür angelegten Tabellen gespeichert werden. Die Einträge der einzelnen Dropdowns werden dabei immer wieder mal geändert/gelöscht/erweitert. Daher kann man diese über entsprechende Interfaces im BackEnd administrieren. Dabei ergibt sich das Problem, dass die Tabellen mit den Einträgen nicht einfach geändert oder gelöscht werden dürfen, da sonst die über Fremdschlüssel verknüpften Inhalte bereits angelegter Verträge nicht mehr stimmen würden.
Sollte man bei den Tabellen mit den vorgegebenen Einträgen grundsätzlich nur das Hinzufügen von Einträgen zulassen und das Löschen von Einträgen durch eine Boolean-Spalte(Aktiv/Inaktiv) ersetzen und bei Änderungen einfach den alten Wert inaktiv setzen und einen neuen aktiven erstellen? Oder sollte man besser gleich die Inhalte selbst an Stelle der Fremdschlüssel im Vertrag speichern, weil dann die Auswahl unabhängig von den bereits vorhandenen Verträgen jederzeit geändert/ergänzt/reduziert werden kann?
Die letzte Frage lässt sich auch auf das Erzeugen von Rechnungen übertragen. Hier würde ich aus Gründen der Dokumentations-Sicherheit noch viel mehr dazu tendieren, statische Daten anstelle der Fremdschlüssel zu speichern. Eventuell kann ja jemand diese Fragestellung auch im Hinblick auf Rechnungen beantworten.
Ich hoffe, das war jetzt nicht zu viel Text und bedanke mich schon mal fürs Lesen.
Viele Grüße
Injector