Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Sinnfrage zu Datenmodell

Begonnen von Beaker s.a., Juni 22, 2016, 16:02:15

⏪ vorheriges - nächstes ⏩

Beaker s.a.

Moin,
Ich habe da ein kleines Projekt mit ca. 2 Dutzend Tabellen. Nun soll ich
das erweitern, wozu ein weiteres halbes Dutzend Tabellen benötigt werden.

So weit so gut alles kein Problem  ;)

Beim Erstellen dieser Tabellen ist mir jetzt (erst  >:() aufgefallen, dass
es in fast allen Tabellen die identischen Felder zur Protokollierung von
"wer-was-wann-gemacht-hat" gibt.

Anmerkung: Es geht nur darum die Anlage eines DS und dessen letzte
(also nicht historisch) Änderung, nicht auf Feldebene, zu erfassen.

Jetzt also meine Fragen,
1. macht das Sinn?
2. passt das Modell (siehe Grafik) dazu?

Vielen Dank im Voraus für Eure Mitarbeit.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,

verstehe die Frage nicht...

Willst Du die "wer-was-wann"-Felder in eine extra Tabelle auslagern? Bei einer "nicht historischen" Vorgabe würde das eher keinen Sinn machen.. Trotzdem ist es natürlich möglich...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo Franz,
Zitatverstehe die Frage nicht...
Nee, is klar, sorry, da war ich mal wieder zu schnell  >:(
ZitatWillst Du die "wer-was-wann"-Felder in eine extra Tabelle auslagern?
Ja, genau das war die Absicht.
ZitatBei einer "nicht historischen" Vorgabe würde das eher keinen Sinn machen..
Kannst du das noch näher erläuten?
Und, - passt dann das Modell zu einer historischen Erfassung?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,


also doch historisch...?

Wenn die "DS-Bearbeitungsdaten" historisch erfasst werden sollen, dann ist schon eine separate History-Tabelle erforderlich. Es muss eben neben der jeweiligen ID auch die Herkunftstabelle dieses ID_Feldes in der History-Tabelle geführt werden...


Die "DS-Bearbeitungsdaten" entfallen dann aus den anderen Tabellen.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

crystal

Hallo,
es macht schon Sinn, Änderungen in der MA-Tabelle zu führen und separat auch bei den Kontakten.
Allerdings fällt mir auf, dass es in beiden Tabellen keinen Status (aktiv, gelöscht) gibt, weshalb der Sinn der Felder "DatumGeloescht" etwas schwer zu verstehen ist, es sei denn, in Abfragen steht jeweils ein "...And DatumGeloescht = Null" oder sowas.

Nur Felder "letzte Änderung am... von..." zu führen ist m. E. kritisch, da man nicht nachvollziehen kann, was denn die letzte Änderung war. Eine einfache Lösung könnte darin bestehen, schlicht alle Felder z. B. kommasepariert vor und nach einer Änderung als langen Text in eine Audit-Tabelle zu schreiben, z. B. mit einem Loop über me.controls(i).

Wenn es wirklich nur darum geht, Anlage- und Änderungs-Datum zu speichern, macht das DM schon Sinn, da diese Werte in jedem DS gespeichert werden. Fraglich ist eben nur, welchen Sinn es macht zu erfahren, dass ein DS z. B. vorgestern geändert worden ist ohne zu wissen, welche Daten denn nun geändert wurden. Datenschutz-Aspekte (wer) einmal hintenan gestellt...
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

Hallo,

@ Franz
Zitatalso doch historisch...?
Ist halt meine Überlegung. Wenn ich es sowieso auslagere, und es ohne
Historie wenig Sinn macht, kann ich es ja auch gleich historisch anlegen.
Dazu war meine Frage nach dem Aufbau des Modells.
Rest ist klar, und sollte eigentlich aus der Grafik ersichtlich sein. Die TableID
hole ich mir aus MSysObjects.

@crystal
Es geht nicht nur um die beiden gezeigten Tabellen; - wie gesagt, das
sind ganzen jetzt so um die 30.
Zitatin Abfragen steht jeweils ein "...And DatumGeloescht = Null"
So ist es, denn es wird ja nicht physisch gelöscht.

ZitatFraglich ist eben nur, welchen Sinn es macht zu erfahren, dass ein DS z. B. vorgestern geändert worden ist ohne zu wissen, welche Daten denn nun geändert wurden.
So genau will der Auftraggeber es nicht wissen, ihm reicht es zu wissen,
wer da zuletzt dran war.

Danke für eure Anteilnahme, und wenn da jetzt nicht noch was zum DM
kommt, würde ich das Thema schliessen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

crystal

Hallo nochmal,

Falls deine Frage dahin deutet, die durchgestrichenen Felder im DM in eine separate Tabelle auszulagen (Normalisierung), würde ich davon abraten. Es ist sicher einfacher, diese Felder an der Oberfläche zu besetzen und sie in der betreffenden Tabelle zu speichern, als sie in eine extra Tabelle zu schreiben, was dann wieder zu komplizierteren Abfragen führen würde. Hierzu müsste man auch eine Referenz auf das geänderte Objekt mitführen, wie ja bereits in einer anderen Antwort gesagt wurde.

Liegen die Änderungs-Daten in den Tabellen selbst, kann doch viel einfacher darauf zugegriffen werden und das Prinzip der Redundanz-Vermeidung wäre anderenfalls nur durch erhöhten Verwaltungs-Aufwand zu erreichen. Auch würden Änderungs-Datensätze in einer Extra-Tabelle keinen Speicherplatz einsparen, da es nicht möglich ist, zu einem bestimmten Zeitpunkt gleichzeitig mehrere DS zu ändern (es sei denn. man beschränkt sich auf ungefähre Zeit-Angaben). Einziger Vorteil einer separaten Audit-Tabelle wäre es, einfach abfragen zu können, welcher Mitarbeiter in einem bestimmten Zeitfenster an welchen Tabellen Änderungen vorgenommen hat. Aber das ist mit einer mehrfachen UNION-Abfrage auch machbar und im SQL-Modus schnell codiert.



Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

Hallo crystal,
ZitatHierzu müsste man auch eine Referenz auf das geänderte Objekt mitführen,
Welches Objekt?
Ich habe die TableID aus MSysObjects und den PK des DS aus der Tabelle.
Das sollte doch reichen.

ZitatLiegen die Änderungs-Daten in den Tabellen selbst, kann doch viel einfacher darauf zugegriffen werden
Das scheut mich nicht.

Zitatdas Prinzip der Redundanz-Vermeidung wäre anderenfalls nur durch erhöhten Verwaltungs-Aufwand zu erreichen.
Welche Redundanz? Da wird doch nur jeweils ein DS in die Protokolltabelle
geschrieben.

Ich mach mal 'nen Test mit ein paar wenigen Tabellen und schau mir den
Aufwand an.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

crystal

Hallo Ekkehard,
wir meine ja beide das gleiche.
Die TableID und der PK sind zusammen eine Referenz auf das geänderte Objekt, das in der Audit-Tabelle geführt wird.

Aber warum einen solchen Aufwand treiben?

Im engeren Sinne handelt es sich um Redundanz, wenn in zwei oder mehr Tabellen Felder gleichen Namens/Inhalts existieren, oder? Genau genommen sind diese Felder aber nicht redundant, da sie nie denselben Inhalt haben/haben können (außer MA-Name). Naja - und kaum jemand käme auf die Idee, z. B. in einer MA-Tabelle den Vornamen auszulagern, um Redundanz zu vermeiden. Das wäre schlicht praxis-fern und dshalb macht es auch keiner. Vermutlich nicht einmal in der Telefonnummern-Datenbank der Telekom, trotz einiger Millionen Einträge. Und genau das meine ich, wenn man Datum/Uhrzeit/MA des Anlegens und der letzten Änderung eines Datensatzes schlicht im Datensatz selbst speichert, statt diese Informationen in eine separate Tabelle (mit Referenz aufs geänderte Objekt, s. o.) auszulagern.

Ein Test ist sicher gut, vor allem, wenn es sich um die Erweiterung eines bestehenden Systems handelt. Wenn du aber nur ein halbes Dutzend Tabellen zum Bestand hinzufügen musst, lohnt es m. E. nicht, hier neue Funktionalität oder Logik zu implementieren. Auch im Sinne der Pflegbarkeit eines solchen Systems wäre es vermutlich besser, bestehende Überlegungen/Techniken des Vorgängers zu übernehmen.

Aber egal - du wirst sicher eine praktikable Lösung für dein "kleines Projekt" finden, denn du bist ja kein Access-Neuling, sondern ein erfahrener Profi! Und das meine ich ehrlich.

Respektvolle Grüße

crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

Hallo crystal,
ZitatAber warum einen solchen Aufwand treiben?
Weil's Spass macht was zu lernen.

Zitatsondern ein erfahrener Profi
Nicht wirklich, aber trotzdem danke für die Blumen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)