BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datenbankdesign Beziehungskreis

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
deife
Beiträge: 22
Registriert: Di 5. Jan 2021, 16:48

Datenbankdesign Beziehungskreis

Beitrag von deife » Sa 6. Feb 2021, 11:09

Hallo Leute,

ich hab ein Problem (ähnlich wie viewtopic.php?f=10&t=15213&p=37041&hili ... zug#p37041) mit meinem Datenbankdesign, aber mir Fällt nichts besseres ein.

Ich hab alle meine Kontobewegungen in Base importiert (anderes Forum-Topic - Danke nochmal). Diese Tabelle wollte ich nicht anfassen, weil ich vor habe hier fortlaufend weitere Kontobewegungen zu importieren.

Für die Steuer möchte ich diese Kontobewegungen in Kategorien einteilen. Also eine Tabelle mit der ID der Kontobewegung (1:1 zu Kontotabelle) und mit einer ID der Kategorie.

Beispiel: es gibt die Kategorien Fahrtkosten und Arztkosten. Die Summen kann ich mit GROUP BY anzeigen und hätte dann einen Gesamtüberblick. Aber ich möchte es noch weiter detailieren und Fahrtkosten nach Mann/Frau aufteilen. Genauso die Arztkosten nach Apotheke/Zahnarzt....

Meine Tabelle der Kategorie hätte dann drei Spalten (ID-Buchung, ID-Kategorie und ID-Unterkategorie). Soweit so gut, aber ich hab ein Problem mit dem Befüllen der Tabelle im Formuar. MainForm sind die Buchungen, SubForm ist die Kategorisierung. Die Kategorie wird über ein Listenfeld eingetragen, aber für die Unterkategorie dürfte ich nur die Elemente im Listenfeld anzeigen, die zu der ausgewählten Kategorie gehören.

Screenshot_20210206_105949.png
Screenshot_20210206_105949.png (9.63 KiB) 2218 mal betrachtet

Jetzt ist die Frage: Liegt es am Datenbankdesign und es geht nicht anders, wie in dem Thema, das ich oben verlinkt hab, oder kann ich mit einem Listenfeld eine SQL-Abfrage basteln, mit der ich an anderes Feld des aktuellen Datensatzes abfragen kann (Bedingte Anzeige in einem Listenfeld).

Grüße
deife

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Datenbankdesign Beziehungskreis

Beitrag von gogo » Sa 6. Feb 2021, 15:42

Kategorie/SubKategorie ist ein bisserl kompliziert. Die Datenstruktur ist eh linear, also reicht ein einfaches Textfeld in der Tabelle "Grp"
Das Listenfeld dieses Feldes in Grp sieht dann etwa so aus:
Screenshot_20210206_153949.png
Screenshot_20210206_153949.png (3.55 KiB) 2207 mal betrachtet
Anders wäre es, wenn Du einer Buchung mehrere Kategorien zuordnen willst, dann reicht eine 1:1 natürlich nicht mehr aus

Weiters:
Die Tabelle "Grp" brauchst Du eigentlich gar nicht, häng' einfach noch ein Feld in der Buchungstabelle an - das hat ja mit dem Import von Daten nichts zu tun.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

deife
Beiträge: 22
Registriert: Di 5. Jan 2021, 16:48

Re: Datenbankdesign Beziehungskreis

Beitrag von deife » Sa 6. Feb 2021, 16:24

ja, die Struktur ist etwas gewachsen. Aber von Anfang an. Die Buchungstabelle möchte ich so lassen, weil ich später wieder Buchungen dazu importieren möchte und da möchte ich keinesfalls irgendwas mit den vorhandenen Daten riskieren. Und das Importieren hat so seine Tücken (anderer Thread).

Auch an dem 1:1 wird sich nichts ändern, weil die Steuer da auch etwas unflexibel ist und man die Kosten nur einmal absetzen kann. ;) Außerdem kann man dann mit einem einfachen GROUP BY eine komplette Summenübersicht machen und man sieht dann, wo die ganze Kohle versickert.

An das hab ich auch schon gedacht, dass ich nur eine ID als Kategoriekombination in der Tabelle Grp speichere. Dazu müsste ich aber alle Buchungssätze nochmal durchackern - gut müsste ich für die Unterkategorie auch, aber ich fürchte etwas an Flexibilität zu verlieren. Momentan hab ich alles in der Kategorie Auto zusammengefasst und weiß genau wie viel das im Jahr kostet. Wenn ich mit der Kategoriekombination arbeite, dann müsste ich die Rubriken Auto-Er, Auto-Sie, Tanken, und Werkstatt zusammenzählen. Und das dann bei allen Kategorien mit Unterkategorien.....

deife
Beiträge: 22
Registriert: Di 5. Jan 2021, 16:48

Re: Datenbankdesign Beziehungskreis

Beitrag von deife » Sa 6. Feb 2021, 17:56

mir ist nochwas eingefallen.

wenn es nur eine Kombi-Kategorie gibt, dann ist bei der Auswahl der Liste das Listenfeld sehr lang. Wenn zuerst eine Hauptkategorie und abhängig davon eine Unterkategorie wählbar wäre, dann verkürzen sich die Listenfelder dramatisch.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Datenbankdesign Beziehungskreis

Beitrag von RobertG » So 7. Feb 2021, 10:14

Für eine Hauptkategorie und eine Unterkategorie muss der Fremdschlüssel der Hauptkategorie in die Tabelle der Unterkategorie geschrieben werden und der Primärschlüssel der Tabelle Unterkategorie als Fremdschlüssel in die Tabelle "Grp".

Im Hauptformular hast Du die Hauptkategorie.
Im Unterformular hast Du die Unterkategorie.
Im UnterUnterformular hast Du den Gegenstand oder was immer das ist.

Die Hauptkategorien haben natürlich eine separate Tabelle "Kat", aber keine Verbindung zu "Grp".
Die Unterkategorie hat eine Tabelle "Sub". Da gibt es keinen Primärschlüssel aus 2 Feldern, sondern nur "ID" für die Tabelle 2Sub". "ID_Kat" ist ein Fremdschlüssel.
Die Verbindung von "Grp" zu "Kat" ist damit über "Sub" geregelt. Das Feld "ID_Kat" wird aus "Grp" entfernt.

Und spätestens jetzt stellst Du fest: "Grp" hat nur einen Fremdschlüssel, aber gar keinen weiter Inhalt. Also kann "Grp" gleich raus fliegen und "ID-Kat" in der Tabelle stehen, die in dem Screenshot nicht mit aufgeführt wird.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

deife
Beiträge: 22
Registriert: Di 5. Jan 2021, 16:48

Re: Datenbankdesign Beziehungskreis

Beitrag von deife » So 14. Feb 2021, 11:12

Hallo Robert,

wenn ich alles richtig verstanden habe, dann müsste das vorgeschlagene Datenbank-Design so aussehen:

DBRelNeu.png
DBRelNeu.png (12.51 KiB) 2104 mal betrachtet
Ja, man könnte das verbliebene Feld in Grp auch in die Tabelle Konto integrieren. Aber es gibt eine andere Schwachstelle. Wenn die Kategoriekombination als ID in Grp gespeichert wird, dann könnte es doppelte Kategoriekombinationen in der Tabelle Sub geben, die sich nur durch die ID unterscheiden.

Ich hab das mal in Access dargestellt:

DBRelAc.png
DBRelAc.png (8.58 KiB) 2104 mal betrachtet

Ich hab die Access-Beziehung mal probiert, aber ich bekomme immer die Meldung, dass ALTER TABLE nicht funktioniert, weil man für so eine Beziehung einen Primary Key benötigt. Leider kann ich nicht beide Felder markieren und auf die andere Tabelle ziehen. Ist diese Beziehung aus Access auch in Base möglich?

Grüße
deife

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Datenbankdesign Beziehungskreis

Beitrag von RobertG » So 14. Feb 2021, 11:51

Hallo deife,

was soll die Tabelle "Grp" bewirken? Sollen dadurch mehrere Kategorien für ein Konto zugewiesen werden? Dann müssten beide Felder zusammen ein Schlüsselfeld bilden.

Ich gehe davon aus, dass das nicht so geplant ist. Also gehört in "Konto" ein Feld "ID_Grp" und die Tabelle "Grp" kann gelöscht werden. In "Sub" kann außerdem das Feld "ID_Sub" entfernt werden.

Deine Access-Konstruktion ist geht bei "Sub" von einen doppelten Primärschlüssel aus . Warum das so sein soll erschließt sich mir überhaupt nicht. Auch da gilt:
Entferne "Grp". Schreibe in "Konto" ein Feld "ID_Sub". Mache in "Sub" "ID_Sub" zum alleinigen Promärschlüssel. Verbinden "Sub" und "Konto" über "ID_Sub".

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Datenbankdesign Beziehungskreis

Beitrag von gogo » So 14. Feb 2021, 17:56

Du brauchst gar keine Beziehungen zwischen Tabellen zu definieren. Eine Datenbank funktioniert problemlos auch ohne Beziehungen.
... das löst in diesem Fall einige Probleme.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Datenbankdesign Beziehungskreis

Beitrag von RobertG » Mo 15. Feb 2021, 09:11

Ohne Beziehungen solltest Du dann aber auch sagen, dass Du die grundlegende Integrität von relationalen Datenbanken über den Haufen wirfst.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

deife
Beiträge: 22
Registriert: Di 5. Jan 2021, 16:48

Re: Datenbankdesign Beziehungskreis

Beitrag von deife » Mi 17. Feb 2021, 17:54

Zu den Tabellen greife ich mal ein Beispiel von weiter oben auf.

Tabelle Kat:
ID_Kat - Bez
1 - Auto

Tabelle Sub
ID_Kat - ID_Sub - Bez
1 - 1 - Peter
1 - 2 - Sabine

Tabelle Grp
ID_Kto - ID_Kat - ID_Sub
435 - 1 - 1
476 - 1 - 1
523 - 1 - 2
......

Über die Tabelle Grp kann ich die Abbuchungen vom Konto in Kategorien einteilen. Sicherlich würde es auch funktionieren, wenn man die Spalten ID_Kat und ID_Sub an die Tabelle Konto anhängen würde. Eine Buchung auf dem Konto hat nur eine Zuordnung zur Kategorie.

Damit kann ich mir die Gesamtkosten über das Jahr in zwei Stufen anzeigen lassen. Einmal etwas genauer mit Unterkategorie:

Code: Alles auswählen

SELECT "Grp"."ID_Kat", "Grp"."ID_Sub", SUM( "Konto"."Betrag" ) FROM "Grp", "Konto" WHERE "Grp"."ID_Kto" = "Konto"."ID" GROUP BY "Grp"."ID_Kat", "Grp"."ID_Sub"
und einmal als Zusammenfassung:

Code: Alles auswählen

SELECT "ID_Kat", SUM( "Betrag" ) FROM "Grp" INNER JOIN "Konto" ON "ID" = "ID_Kto" GROUP BY "ID_Kat"

Dazu brauche ich den doppelten Primärschlüssel, um einerseits diese zweistufige Anzeige zu machen und andererseits die Kombination aus ID_Kat und ID_Sub eineindeutig zu halten. Sonst könnte man in der Tabelle Sub so was machen:

ID_Kat - ID_Sub - Bez
1 - 1 - Peter
1 - 2 - Sabine
1 - 2 - Tanken
(wenn die Tabelle größer wird, dann kann es schon mal unübersichtlich werden).


Grüße
deife

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten