AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Datenbankdesign: Den Grad des Hirnrisses bestimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbankdesign: Den Grad des Hirnrisses bestimmen

Ein Thema von Furtbichler · begonnen am 19. Okt 2012 · letzter Beitrag vom 23. Okt 2012
Antwort Antwort
Seite 1 von 2  1 2      
Furtbichler
(Gast)

n/a Beiträge
 
#1

Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 07:53
Datenbank: egal • Version: egal • Zugriff über: egal
Hallo Leute,

Ich bin heute bei einer von uns zu pflegenden Datebank auf zwei Konzepte gestoßen, die ich höchst merkwürdig finde:

1. Semantisch äquivalente Daten in unterschiedlichen Tabellen
Sagen wir, wir haben eine Tabelle 'Aufträge'. Nun entdecke ich eine weitere Tabelle 'AufträgeVonOstblockKunden' und eine 'AufträgeAnFremdfirmen'. Und -oh- 'AufträgeVonOstblockKundenVomLetzenJahr' usw.

Aber: Ein Auftrag wandert äußerst selten von einer Tabelle zur nächsten. Nur beim Jahreswechsel werden die Aufträge an Ostblockkunden in die Tabelle vomletzenJahr verschoben.

2. Spalte als "Foreign Key" zeigt auf unterschiedliche Tabellen.
Ich habe drei Tabellen: A1, A2 und B. B enhält eine Spalte 'FID' und eine Spalte 'FTBL'.
In FID steht eine ID drin. Wenn in FTBL der Wert 'A1' steht, dann ist die ID der PK von A1. Steht in FTBL 'A2', ist die ID der PK von A2.

(A1 und A2 sind also die unterschiedlichen Auftrags-Tabellen).

Ich glaube, der Designer hat (2) so umgesetzt, weil er sich mit (1) schon ins Knie geschossen hat.

Nun ist die Firma, die das gebaut hat, ziemlich groß und schon lange als recht guter Softwaredienstleister weltweit vertreten. Ich habe also Probleme, denen zu sagen, das ihr Design Schrott ist (ich mach das aber, wenn ich mir sicher bin).

Das System ist über die Jahre gewachsen (typisch). Aber die Verteilung von eigentlich kompatiblen Daten auf unterschiedliche Tabellen ist mutwillig und wird heute noch so praktiziert.

Ich frage mich also, was die Motivation für so ein Design sein könnte.

Weiterhin frage ich mich, gegen welche Norm bzw. Grundsätze (Stichwort: Normalform) dieses Design verstößt.

Für sachdienliche Hinweise wäre ich dankbar.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.869 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 08:11
Zu 1.) Eine Trennung in Tabellen nach Jahren ist eigentlich unnötig, es herrscht aber oft die Vermutung, dass es schneller sei/wird wenn die Anzahl der DS geringer ist/man diese verringert.
Eine tabellarische Trennung nach Kundenarten(-erkunft) macht imho noch weniger Sinn ( höchstens man benötigt verschiedene Rechnungskreise).
Zu 2.) Wenn man schon 1. prakiziert sollte man das dann konsequent tun und auch die Detailtabellen trennen.
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 09:00
Ich geh mal davon aus, dass es bei den Problemen nicht um Mandantenverfahren handelt.

Trennung der Tabelle nach Kriterien (Jahr) wird allgemein als Partitionierung bezeichnet und vom RDBMS selbst durchgeführt, sofern es dazu in der Lage ist (die teure Option gekauft/lizensiert wurde)
Was Du schreibst ist also gewissermaßen Partitionierung für Arme. Ich halte es je nach Umständen/Historie des Produkts, etc. für legitim. Insbesondere, wenn es eine logische Schicht gibt (einfache Union Views), die für einen generellen Zugriff auch die Gesamtsicht liefern.
(Z.B. wenn das Datenvolumen in den Terrabytebereich geht, irgendwann kommt der Performanceunterschied, oder Produktivdaten, die sehr stark am Geschäftsjahr orientiert sind- und später uninteressant bzw eher DWH Charakter haben- ohne das ein DWH da ist)
Variable Relationen

Wenn es gut modelliert ist, finde ich auch das nicht "schlimm".
Beispiel "Adresse":
Nimm eine Firma (Standort, Produktion A, B, ..) und Personen, die in der Firma arbeiten. Alle haben Adressen. Nun kann man je nach Anforderung
a) die Firma gar nicht abbilden (außer im denormalisierten Firmennamen des MA- der immer wieder auftaucht)
b) Firma und Mitarbeiter identisch "modellieren" und in eine (juristische)PersonTabelle packen. Man spendiert noch ein paar entweder oder Spalten je nach Typ oder verschiedene 1:1 Tabellen, die spezifische Daten ausmodellieren
c) man verwendet von vornherein verschiedene Tabellen für Firmen und Mitarbeiterm, trotzdem haben beide eine Adresse (und Telefon und Email ... je nach Sicht)
Sowas macht man nach rei(f/ch)licher Überlegung und mit einer perfekten Absicherung im Backend. (siehe auch Dein eigener Beitrag zu ERP, btw: ich hab es mir noch nie angetan ein ORM Datenmodell eines komplexen Systems zu produzieren oder zu analysieren, vermutlich annotiert man sich tot, um etwas brauchbares hinzubekommen )

Ich finde sowas sogar so "brauchbar", dass ich eigentlich nur darauf warte, wann soetwas logisch von einem RDBMS unterstützt wird. (was wohl nie passieren wird)
Noch was:
Eine solche variierte Referenzierung kannst Du im Backend so wrappen, dass es niemand merkt, den es nichts angeht (Entwickler, Kunden).
Ob das gegen eine (wissenschaftliche) Norm verstößt, wäre mir ziemlich egal. Es geht doch darum, die Möglichkeiten eines Systems intelligent und effizient auszunutzen. Daran hindert mich höchstens der Kunde selbst.
Natürlich müssen solche Verfahren angemessen dokumentiert sein.

Ein weiterer Stichpunkt wäre noch Zugriffs / Rechtekonzept.
Falls ein RDBMS keine inhaltsorientieren Berechtigungskonzepte mitbringt, könnte es auch zu solchen "Lösungen" führen. Vorstellbar wäre z.B. eine Schmiergeldtabelle je nach Himmelsrichtung. Die darf natürlich nicht jeder bearbeiten oder sehen, etc. pp blabla
Gruß, Jo
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 10:19
Gerade bei älteren Projekte waren zum Zeitpunkt des Entwurfs noch keine SQL-Datenbanken geplant.
Die Zugriffszeiten waren häufig direkt proportional der Menge der gespeicherten Daten in einer Tabelle.
Deshalb hatte es da durchaus Sinn ältere oder wenig gebrauchte Daten auszulagern.
Bei einem späteren Umstieg wird in der Regel kein Datenbankdesigner beauftragt, kostet ja alles erst einmal Zeit und Geld. Man verändert das Konzept nicht sondern verlagert nur die Daten. Damit spart man auch gleich den Aufwand die Abfragen im Programm zu optimieren. Solange die Software damit alle gestellten Anforderungen erfüllen kann, ist auch alles in Ordnung. Ist das nicht mehr der Fall, hat man natürlich das Problem dem Kunden klar zu machen, daß eine Weiterentwicklung nur mit einer relativ aufwendigen Änderung der Grundstrukur möglich ist.

- Analyse der vorhandenen Anwendungsfälle und Anwendungstest entwickeln
- neue Datenstruktur entwickeln
- Ersetzen der alten Tabellen durch DB-View und/oder DB-Procedure für alte Programmteile
- Konvertierung der Daten
- Testen

Zitat:
2. Spalte als "Foreign Key" zeigt auf unterschiedliche Tabellen.
Ich habe drei Tabellen: A1, A2 und B. B enhält eine Spalte 'FID' und eine Spalte 'FTBL'.
In FID steht eine ID drin. Wenn in FTBL der Wert 'A1' steht, dann ist die ID der PK von A1. Steht in FTBL 'A2', ist die ID der PK von A2.
Das hört sich eigentlich so an als währen A1 und A2 Rollen von B.
Dann ist die ID in A1, A2 und B Primärschlüssel, in A1 und A2 zusätzlich "Foreign Key" auf B.
B <- A1
B <- A2
Als Objektmodel:
- Das Objekt wird immer mit ID und den Eigenschaften der Basisklasse in B gespeichert.
- Für Ableitungen(A1) werden unter der selben ID in der Tabelle A1 die zusätzlichen Eigenschaften gespeichert
- Für Ableitungen(A2) werden unter der selben ID in der Tabelle A2 die zusätzlichen Eigenschaften gespeichert
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 16:16
Ich finde sowas sogar so "brauchbar"
Ich nicht, denn ein FK-Constraint ist so nicht möglich.
Zitat:
Es geht doch darum, die Möglichkeiten eines Systems intelligent und effizient auszunutzen. Daran hindert mich höchstens der Kunde selbst.
Natürlich müssen solche Verfahren angemessen dokumentiert sein.
Ich glaube, man hat ein Designproblem gemacht, wenn man diese Art der FK-Referenzierung betreibt.

Und: Ja, ich breche das 3NF-konform (nun, sagen wir 2.7NF) herunter und es gelingt mir sehr gut. Hinterher freue ich mich, wie stringent und transparent ich Erweiterungen umsetzen kann.
Vielleicht kannst du es ja anders anfangen und darum bitten, dir die Gründe für dieses Design zu erklären.
Genau das werde ich machen, denn der PM ist ein sehr fähiger Kopf. Vermutlich sind das Altlasten, die auch an seiner Ehre nagen: Aber man kann so ein Design nicht einfach wegradieren.

Vielleicht war es auch eine gewachsene Applikation, .. oder ein Entwickler, der solche Grenzen im Kopf hatte.
Super schlußgefolgert: Dieses Argument (argh! Die DB wird soo groß! Bei 10 Mio Records) höre ich immer wieder. Und gewachsen ist es ja.
Die Zugriffszeiten waren häufig direkt proportional der Menge der gespeicherten Daten in einer Tabelle.
Ich glaube langsam auch, das das historisch bedingt ist. Bezüglich deines Vorschlags. Mir geht es nicht um die Lösung zu diesem Problem, denn das geht eh nicht ohne massive Änderungen an der Software und langsfristig wollen wir eh weg von der Lösung.
Mir scheint es eher, als ob da nach der Planungs-/Entwicklungsphase noch ein Änderungswunsch hinzukam, der so fix auf dem kleinen Dienstweg gebastelt wurde. Sollte nix kosten nur eben tuten ...
Leute, es ist doch echt witzig: Ich beschreibe ein Fragment einer bekloppten Umsetzung (DB-Design) und nacheinander ist die Community in der Lage, die Historie dieser Applikation genau zu erzählen:

Es ist eine über die Jahre gewachsene Applikation, die vermutlich ihre Anfänge dort nahm, als Speicher noch teuer war und heute werden -wie Sir Rufo treffend bemerkt- Änderungswünsche über den kleinen Dienstweg gebastelt. Gerade gestern ist eine neue Tabelle 'A23' hinzugekommen ist.

Mittlerweile bemerken die das auch und haben ein Szenario entworfen, was passiert, wenn man einen Datensatz ändert und was das für Auswirkungen hat.

Es ist grauenhaft und ich möchte zu meiner Mama.

Ich kann also als Fazit, das es *nicht* state of the art ist, ziemlicher Blödsinn und die einzige plausible und entschuldbare Erklärung die der bekannten "Altlasten" ist, deren Elimination beauftragt werden müsste. Richtig?

Ich werde auch, danke Uwe Raabe, freundlich nachfragen, ob es einen tieferen Sinn gibt.

PS: Danke für die wirklich amüsanten Anekdoten und Einschätzungen, die doch so ziemlich alle ins Schwarze getroffen haben.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 16:53
Ich kann also als Fazit, das es *nicht* state of the art ist, ziemlicher Blödsinn und die einzige plausible und entschuldbare Erklärung die der bekannten "Altlasten" ist, deren Elimination beauftragt werden müsste. Richtig?
Hmm, mit "state of the art" habe ich so meine Probleme.
Es gab schon soo viele Luftschlösser/Bruchbuden, die als Lösung aller jetzigen und zukünftigen Probleme verkauft wurden, solange es eine Lösung tutet solange ist sie brauchbar, egal ob ISAM,Rel.Datenbank oder Cloud.
Wer hatte "the cloud" noch mal mit Wolkenkuckucksheim übersetzt?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 23. Okt 2012, 10:34
Solche Tabellen können auch bei der Verwendung eines ORM entstehen.

öfter als man erwarten würde, entscheidet man sich dabei nämlich dafür eine eigene Tabelle für bestimmte Ableitungen zu haben.
Auf der anderen Seite einer Assoziation wird dann der ORM eine "Discriminator column" anlegen, damit er sofort weiß was er wie abzufragen hat.

Habe ich selbst schon öfters benutzt, einfach weil der Profiler meinte es sei schneller.

Foreign keys sind IMO überbewertet. Zumindest wenn man einen ORM einsetzt. Aber das kommt sicherlich auf den Use-case an. Vor allem ob direkter Zugriff auf die DB ermöglicht werden soll.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#8

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 23. Okt 2012, 11:47
Es ist grauenhaft und ich möchte zu meiner Mama.
Weiss deine Mama, wie man Entity-Relationship-Modelle erstellt?
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#9

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 09:34
Nun ist die Firma, die das gebaut hat, ziemlich groß und schon lange als recht guter Softwaredienstleister weltweit vertreten. Ich habe also Probleme, denen zu sagen, das ihr Design Schrott ist (ich mach das aber, wenn ich mir sicher bin).
Vielleicht kannst du es ja anders anfangen und darum bitten, dir die Gründe für dieses Design zu erklären. Am besten gleich mit deinem Änderungsvorschlag mit der Bitte um Prüfung, ob das nicht irgendwelche Vorgaben verletzt, die dir vielleicht nicht bekannt sind. Manchmal ist es leichter einen Fehler einzuräumen als ihn zu rechtfertigen - insbesondere wenn der damals Verantwortliche womöglich jetzt gar nicht mehr im Unternehmen ist.

Es mag durchaus Gründe für dieses Design geben oder gegeben haben (kann ich mir zwar nicht vorstellen), aber es mag andere Lösungen dafür geben, die etwas geradliniger sind.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
684 Beiträge
 
Delphi 12 Athens
 
#10

AW: Datenbankdesign: Den Grad des Hirnrisses bestimmen

  Alt 19. Okt 2012, 10:17
Es mag durchaus Gründe für dieses Design geben oder gegeben haben (kann ich mir zwar nicht vorstellen), aber es mag andere Lösungen dafür geben, die etwas geradliniger sind.
Vielleicht war es auch eine gewachsene Applikation, welche früher an DBF-Grenzen stieß (2GB bzw 4GB, je nach Treiber) - oder ein Entwickler, der solche Grenzen im Kopf hatte. Da wir DBF als natives Storage unterstützen, sehe ich das sehr oft
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz