Hallo ihr Profis :)
Ich bin hier grad mit "bring mal die Access-Datenbank in Ordnung, die eher weniger ideal konstruiert wurde und chaotisch eingetragen ist" beauftragt und bringe mir das zudem alles grad neu bei. Läuft soweit so gut, aber ein ganz essentielles Problem kann ich nicht lösen.
Sorry wenn ich jetzt was weiter aushole, möchte euch einfach alle Info geben die ihr braucht :)
Ich habe eine Datenbank, mit fünf Tabellen.
tblPersonen <->> tblTestwerte
tblPersonen <->> tblChemiewerte
tblPersonen <->> tblFragebogenwerte
tblPersonen <->> tblBildbeschreibung
Personen_id als Fremdschlüssel Personen_id_f in tblTestwerte
Personen_id als Fremdschlüssel Personen_id_f in tblChemiewerte
Personen_id als Fremdschlüssel Personen_id_f in tbFragenbogenwerte
Personen_id als Fremdschlüssel Personen_id_f in tblBildbeschreibung
Ich weiß grad nicht genau, ob das vielleicht n:m Beziehungen zwischen Detailtabellen sind, die ich brauche.
Ich versuch mal die Beziehung in Worte zu fassen:
Die Person ist einzigartig und kommt in ihrer (Haupt-)Tabelle nur einmal vor, inkl. ihrer ID, dem Primärschlüssel. Von der Person können wir 4 verschiedene Eigenschaften in eigenen Tabellen erheben, die mit der ID als Fremdschlüssel der Person zugeordnet werden können:
Testwerte, Chemiewerte, Fragebogenwerte und Bildbeschreibungen.
Diese Erhebungen werden einem "Visit" zugeordnet. Ein Visit ist so definiert, dass eine Person an mehreren Tagen mit möglichst kurzen Abständen dazwischen kommt, falls wir mehrere Eigenschaften erheben, weil nicht alle Sachen am selben Tag gemacht werden sollen. Erheben wir nur eine Eigenschaft, kommt sie natürlich nur einmal.
Dieselbe Person kann einige Zeit später nochmal zu einem Visit kommen, in einem Jahr oder auch in vier Jahren, das ist unterschiedlich. Welche und wie viele Eigenschaften wir dann erheben ist auch unterschiedlich.
Ich möchte die Option haben, nur jeweils einen bestimmten Visit, z.B. den neusten, von Personen auszuwerten. Leider ist die Datenbank nuneinmal schon so, wie sie ist, und ist zu groß um manuell bereinigt oder umstrukturiert zu werden...meine Idee daher (andere sind natürlich auch willkommen!!!):
Den Datensätzen der Detailtabellen soll eine Nummer hinzugefügt werden, die angibt, der wievielte Visit der Person das war.
Jeder Datensatz in den Detailtabellen hat ein Datum, das zwischen den Datensätzen ,,übereinstimmen" KANN (wenn denn mehrere Eigenschaften im Visit erhoben wurden), in dem Sinne, dass die Person innerhalb eines maximal 3 Monate langen Zeitraums z.B einen Test und einen Fragebogen gemacht hat.
WENN ein Datensatzes in tblTestwerte und ein Datesatz in tblFragebogenwerte denselben Fremdschlüssel hat, und das Datum (nach der 3Monatsregel) ,,übereinstimmt", soll die hinzugefügte Visitnummer übereinstimmen.
Beispiel:
Peter war am 1.2.2010 zu seinem 1. Visit da und hat einen Test gemacht.
Bei seinem zweiten Visit hat er am 2.3.2011 einen Test gemacht und zwei Tage später am 4.3.2011 einen Fragebogen ausgefüllt.
In der Tabelle Test gibt es für Peter nun zwei Datensätze: einmal der Datensatz vom
ersten Visit (1.2.2010) und den Datensatz vom zweiten Visit (2.3.).
In der Tabelle Fragebogen existiert für Peter hingegen nur ein Datensatz vom 4.3, der als 2. Visit gekennzeichnet werden soll, da er innerhalb von 3 Monaten der Testung am
2.3.2011, seinem zweiten Visit, stattgefunden hat.
Ich kann mir vorstellen, dass ich das vielleicht über eine wahnsinnig komplizierte Aktualisierungsabfrage mit vielen Kriterien lösen kann oder dass das auch evtl gar nicht in Access geht, dann ja aber vielleicht über eine Excelexport?
Ich bin ratlos! Hat jemand eine zündende Idee?
Zitatandere sind natürlich auch willkommen!!!
Eine verkorkste Datenbank mit 5 Tabellen sollte man noch übersichtlich umbauen können. Dabei ist die Arbeit, ein passendes und verarbeitungsgerechtes Datenmodell aufzubauen. Daten sind gefügig. Diese würde man natürlich nicht per Hand umlagern, sondern per Anweisungen (datenbanktypisch: Abfragen).
Gedanken:
1) Datenmodell
1:n-Beziehung zwischen Personen und Visits, in Visits könnte man dann auch eine laufende Nummer pro Person führen
m:n-Beziehung zwischen Visits und Eigenschaften
oder so ähnlich
2) Daten umschichten
- Aus vorhandenen Daten per JOIN's die "Exceltabelle" erzeugen.
- Die Exceltabelle auf die neuen Tabellen verteilen a la Importtabelle in m:n-Beziehung auflösen (http://www.dbwiki.net/wiki/Datei:AccSampleDivideTable.zip), das macht dann eine Anfügeabfrage pro Zieltabelle.
MfGA
ebs