allgemeine Frage zum Literatur-DB-Konzept

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

dasBuero
Beiträge: 4
Registriert: Mo, 30.01.2012 19:30

allgemeine Frage zum Literatur-DB-Konzept

Beitrag von dasBuero »

Liebes Forum,

ich bin neu hier und hoffe auf einige Tipps zu meinem ersten DB-Projekt mit Base.
Es geht zunächst ganz grob um eine Datenbank die mit der Zeit (d.h. in ferner Zukunft) verschiedene Aufgaben an einer Forschungsstelle koordinieren und vereinfachen soll. Zunächst geht es aber um eine der wichtigsten Kernaufgaben, nämlich die Archivierung von Literatur an unterschiedlichen Standorten. Ich habe bereits mit einer Datenbank angefangen und habe mich zunächst – als blutiger Anfänger – an einer Datenbankstruktur orientiert, die an einer ähnlichen Forschungsstelle bereits erstellt wurde. Das Problem ist, dass diese DB von jemandem erstellt wurde, der von Datenbank-Konzepten scheinbar keine Ahnung hatte. Dies fiel mir allerdings erst nach der Lektüre zahlreicher Einführungen, Tutorials und Forumthreads auf. Seine DB-"Struktur" bestand aus einer einfachen flachen Tabelle mit einem einzigen Eingabeformular (> 50 Datenfelder).
Um die Stärken einer Datenbank wirklich zu nutzen, würde ich die Tabelle gerne in viele einzelne Tabellen sinnvoll aufteilen. Das Prinzip bzw. die Maxime glaube ich auch grundsätzlich verstanden zu haben (Normalisierung → keine Dopplungen / einzigartige Datensätze, entspr. Relationen etc.), allerdings steckt der Teufel ja meist im Detail. Ich würde gerne alles, oder das meiste, von Anfang an richtig machen, da die Struktur einer Datenbank – wie ich selbst bereits bemerkt habe – im Nachhinein nur schwierig zu verändern ist.

Ich will euch hier nicht die gesamte Struktur beurteilen lassen, da ich hier niemanden überstrapazieren möchte. Deswegen stelle ich zunächst vielleicht eine ganz konkrete Frage, zu einem konkreten Problem.
Das Ziel ist zunächst, dass verschiedene Mitarbeiter Texte archivieren und die entsprechenden Informationen (>50 Datenfelder) in ein zentrales Formular eintragen. Es soll so einfach wie möglich sein, deswegen sollte alles in einem Formular (mit entspr. Subformularen) ablaufen.
Jetzt konkreter: An einem Text oder Buch sind meist mehrere Personen beteiligt ([mehrere] Autoren, [mehrere] Herausgeber, Übersetzer etc.) Ich habe mich dazu entschlossen (wie es auch in Bibliographien sonst üblich ist), mich auf drei beteiligte Personen zu beschränken. Wie ließe sich das nun strukturell auflösen? Mein erster, aber falscher Ansatz ist der folgende:

[Archiv]
#ID → primary Key
#Titel
#Standort
...
#Person1-ID → foreign key [Personen:#ID]
#Person1-Funktion-ID → foreign key [Funktion:#ID] (d.h. Autor, Herausgeber, Übersetzer etc.)
#Person2-ID → foreign key [Personen:#ID]
#Person2-Funktion-ID → foreign key [Funktion:#ID]
#Person3-ID → foreign key [Personen:#ID]
#Person3-Funktion-ID → foreign key [Funktion:#ID]
...

[Personen]
#ID → primary key
#Name
#GebDatum
...

[Funktion]
#ID → primary Key
#Funktion

(Ich hoffe die Tabellen sind einigermaßen selbsterklärend.)
Das Problem ist es nun, die Tabellen mit den richtigen Relationen zu verbinden. 1:n-Relationen sind – soweit ich das sehen kann – nicht möglich, da eine Tabelle (i.d.F. [Archiv]) nicht mehrere Fremdschlüssel aus einer anderen Tabelle enthalten kann. Außerdem kann ein Titel von mehreren Personen geschrieben werden und eine Person kann mehrere Titel schreiben. Wäre das dann nicht eine n:m-Relation? Das trifft doch auch auf die Relation [Archiv]<->[Funktion] zu. Oder verstehe ich hier grundsätzlich etwas falsch? Falls es sich um eine n:m-Relation handelt, ist mir auch noch nicht ganz klar, wie ich diese realisieren kann.

Bei meiner Recherche im Netz und hier im Forum konnte ich leider keine hilfreiche Antwort finden. Ich weiß, dass diese Frage in der einen oder anderen Form schon häufig gestellt wurde, aber mir ist scheinbar einiges noch nicht ganz klar geworden. Ich würde mich sehr über einen kleinen Hinweis freuen :)

Viele Grüße, Albert

LibreOffice 3.4.5
Ubuntu 11.10
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von gogo »

1. Benenne die ID-Felder eindeutig:

Code: Alles auswählen

[Archiv]     wird zu:    [Archiv]
#ID                      #ID_Archiv

usw.
Du brauchst eine Tabelle in der die Autoren dem "Buch" zugeordnet werden:

[Archiv_Autoren]
#ID_Archiv_Autoren → primary Key
#ID_Archiv
#ID_Personen

Wenn Du die [Archiv_Autoren] in ein Unterformular packst und die [Archiv] das übergeordnete Formular ist, dann werden Dir immer die passenden Autoren angezeigt.
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
dasBuero
Beiträge: 4
Registriert: Mo, 30.01.2012 19:30

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von dasBuero »

Vielen Dank für die Hilfe gogo!

Ich hatte nach meinem Posting hier, weitere Threads zum Thema im englischsprachigen Forum gefunden (leider habe ich die Links nicht mehr zur Hand, ich werde sie posten, wenn ich sie wiederfinde). Anhand der dortigen Beispiele habe ich nun eine etwas andere Struktur entworfen, als die, die Du vorgeschlagen hast:
DB-Rel1.png
DB-Rel1.png (34.42 KiB) 2523 mal betrachtet
Ich habe nun zwei Tabellen über die junction Tabelle mit [KFS-Literaturtitel] (ehm. [KFS-Archiv]) verknüpft: Personen und die jeweilige Funktion der Person (Autor, Herausgeber, Übersetzer etc.). Ich habe noch kein entsprechendes Formular gebastelt, wollte aber fragen, ob das so funktionieren könnte? Mir ist allerdings eingefallen, dass die junction Tabelle keine eigene ID hat, die ich zurückbinde an das Feld Personen in [KFS-Literaturtitel] (1:n), damit die ID der Relationen in der Literatur-Tabelle abgespeichert wird. Ist das notwendig, oder komme ich ohne aus?

Viele Grüße,
Albert
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von gogo »

Die ID der Relation brauchst Du nirgends zu speichen - in dieser würde keine relevante Information für Dich stecken. Sie ist ja nur ein Zähler um der Datenbank die Identifikation des Satzes zu ermöglichen.

Prinzipiell und generell gesehen könnte die fehlende ID ein Problem sein, praktisch aber nicht, da es in einer Tabelle deren Felder alle zum PK gehören denkunmöglich ist redundante Informationen zu speichern. Sollte also der unwarscheinliche Fall eintreten, dass ein und dieselbe Person am selben Literaturtitel dieselbe Funktion 2-fach hat (2x Autor - hä was'n das?), und das wichtig wäre dann musst Du da noch was ändern.
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von DPunch »

Servus
dasBuero hat geschrieben:Mir ist allerdings eingefallen, dass die junction Tabelle keine eigene ID hat, die ich zurückbinde an das Feld Personen in [KFS-Literaturtitel] (1:n), damit die ID der Relationen in der Literatur-Tabelle abgespeichert wird. Ist das notwendig, oder komme ich ohne aus?
Das Feld "Personen" muss raus aus Deiner Tabelle [KFS-Literaturtitel].
Alle notwendigen Informationen werden über die Junktion-Table dargestellt, dort lässt sich jederzeit auslesen, welche Person in welcher Funktion an welchem Titel gearbeitet hat.
Davon abgesehen ist Dein Entwurf so, wie es die Normalisierung verlangt.
dasBuero
Beiträge: 4
Registriert: Mo, 30.01.2012 19:30

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von dasBuero »

Vielen Lieben Dank für die sehr schnellen Antworten!

Dass ein Autor zweimal die selbe Funktion in einem Titel hat, ist natürlich auszuschließen. Das war sicherlich eher ein Denkreflex, da ich mich an die Normalisierungsmaxime noch gewöhnen muss. Es ist für einen Anfänger ungewohnt, in der eigentlich zentralen Tabelle so wenig "explizite" Informationen unterzubringen. An die Logik der relationalen Datenbanken muss ich mich einfach noch gewöhnen. Bin aber erst seit ein paar Tagen dabei und vom Fach eigentlich Philosoph ... obwohl ja Logik eigentlich zu meiner Disziplin gehört ... muss ich damals wohl geschwänzt haben :?

Grüße,
Albert
dasBuero
Beiträge: 4
Registriert: Mo, 30.01.2012 19:30

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von dasBuero »

Ich habe nun die n:m Relation korrigiert ...
DB_Rel2.png
DB_Rel2.png (31.25 KiB) 2468 mal betrachtet
... und wollte diese nun in einem kleinen Testformular auf die Probe stellen:
Form_Lit1.png
Form_Lit1.png (9.08 KiB) 2468 mal betrachtet
Wie ihr seht, wollte ich die Eingabe der Personen und deren Funktionen über separate Listenfelder steuern, da dies für DAOs die vermutlich einfachste Möglichkeit wäre. Das Problem ist jetzt natürlich, dass die Felder alle den gleichen Autor anzeigen, da sie sich alle auf die selbe Zeile der Junction-Tabelle beziehen. Wie kann ich das zweite und dritte Feld dazu zwingen die weiteren Personen und deren Funktionen anzeigen zu lassen. Ich bin bereits mehrere Möglichkeiten durchgegangen, aber es hat nicht funktioniert. Eine Tabellenkontrollfeld würde ich gerne vermeiden, da ich die Eingabe zum einen nicht auf 3 beteiligte Personen einschränken könnte (oder doch?) und zum anderen wäre dies für die User umständlicher. Ich würde das Formular gerne so einfach wie möglich halten.
Wäre dies evtl. lösbar, indem ich der Junction-Tabelle ein weiteres eindeutiges ID-Feld verpasse und dieses jeweils mit drei neuen Feldern in der Literaturtitel-Tabelle (Person1-ID, Person2-ID, Person3-ID) über eine 1:n Beziehung verknüpfe oder wäre das zu umständlich oder gar nicht möglich?

Ich habe die ODB-Datei angehängt (
KFS-DB v0.0.1.odb
(58.51 KiB) 118-mal heruntergeladen
), falls dies der Lösung des Problems dienen könnte. Übrigens habe ich einige Einträge in die Junction-Tabelle manuell eingetragen, um zu sehen, ob die Listenfelder bei Erfolg, die drei unterschiedlichen Literatur-Autor-Funktion-Verknüpfungen anzeigen würden ... also nicht wundern.

Grüße,
Albert
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: allgemeine Frage zum Literatur-DB-Konzept

Beitrag von gogo »

Du "musst" mit einem Tabellenkontrollfeld arbeiten, wenn Du zu einer Literaturstelle immer die 0-3 Personen gleichzeitig sehen willst.

Der Grund ist, dass Unterformulare in Base immer nur einen Datensatz anzeigen können sofern sie kein Tabellenkontrollfeld sind.
(Du kannst zwar auch mit einem Listenfeld arbeiten, aber dann kannst Du ja gleich ein Tabellenkontrollfeld benutzen...)

Das Begrenzen auf 3 Unterdatensätze wird wohl mit reinen Bordmitteln nicht möglich sein ... Makro
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Antworten