Laden...

Beziehungen in Access Datenbank

Erstellt von Private Paula vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.388 Views
P
Private Paula Themenstarter:in
31 Beiträge seit 2006
vor 15 Jahren
Beziehungen in Access Datenbank

verwendetes Datenbanksystem: Access

Hallo Leute,

ich weis, Access...., geht aber nicht anders. ich hoffe Ihr könnt mir weiter helfen damit ich den Knoten wieder aus dem Kopf bekomme. Ich brauche eine Abfrage welche auf 3 Tabellen zugreift. Ich habe eine Tabelle "Zeiten" in der Projektzeiten erfasst sind. Dann habe ich eine Tabelle "Adressen" in der die Mitarbeiter erfasst sind und eine Tabelle "Groups" in der Gruppen erfasst sind die den einzelnen Mitarbeitern zugeordnet werden können. In "Adressen" stehen dann nur die Gruppenschlüssel im Feld "Group_ID" aus "Groups" (es können mehrere Gruppenschlüssel (momentan getrennt durch Semikolon) in dem Feld "Group_ID" in "Adressen" stehen, also z.B. "1a;2b;3c". Ferner stehen in der Tabelle "Zeiten" im Feld "MitarbeiterID" die ID's der Mitarbeiter aus "Adressen". Ich brauche jetzt eine Abfrage die mir alle Datensätze aus "Zeiten" liefert welche einen Mitarbeiter aus "Adressen" haben der unter anderem auch zu der Gruppe "1a" gehört. Der Mitarbeiter ist dabei ansich egal. Also in etwa "SELECT * FROM Zeiten Where (<AdressenID den Gruppenschlüssel 1a ENTHÄLT>

Hoffe Ihr bekommt jetzt nicht selbst einen Knoten in die Rübe und könnt mir weiter helfen 😁

Danke und Gruß
Paula

J
1.114 Beiträge seit 2007
vor 15 Jahren

Mal abgesehen vom schlechten Design wegen Mehrfachbelegung im Feld Gruppe aus Adressen (aber das weisst du wahrscheinlich), sollte das so gehen

select z.* from Zeiten z 
inner join Mitarbeiter m on m.MitarbeiterId = z.MitarbeiterId
inner join Adressen a on a.AdresseId = m.AdresseId
where a.Gruppe = '1a' or a.Grupper like '1a;%'
P
Private Paula Themenstarter:in
31 Beiträge seit 2006
vor 15 Jahren

Hallo Jelly, besten Dank für die rasche Antwort, werde es später mal ausprobieren.
Aber was meinst Du mit schlechten Design wegen Mehrfachbelegung? Es wird doch lediglich ein String gespeichert den ich mir dann mittels
string[] elements = sKategorie.Split(';');
wieder zerlege. Ich habe eine separate Form in der die Gruppen angelegt und verwaltet werden. Im Adressenstamm habe ich dann ein ListView mit Checkboxen in der die Gruppen angeboten und selektiert bzw. zugeordnet werden können. Wie würdest Du das denn machen? Für Verbesserungen bin jederzeit dankbar und offen. Zur Erklärung, allzu lange bin ich noch nicht mit C# bzw. OOP unterwegs.

Danke und Gruß
Paula

T
708 Beiträge seit 2008
vor 15 Jahren

Das angesprochene Problem bezieht sich auf eine unsaubere Tabellenrelation.
Datenredundant ist sie vielleicht nicht, aber normalerweise löst man das Problem, das mehrere User in mehreren Gruppen und andersherum sein können, mit einer n:n Beziehung.

Das heißt, das man eine weitere Tabelle zwischen die beiden packt und dort alle Beziehungen einträgt. (Spalte1 UserID, Spalte2 GruppenID)

So kann auch Access oder ein anderes Programm damit etwas anfangen und nicht nur dein C# Proggie was "hart" diese Verknüpfung ausliest.

Gruß, TriB

J
1.114 Beiträge seit 2007
vor 15 Jahren

Es gibt beim Datenbankdesign einfach gewisse Regeln, die unter Normalisierung bekannt sind, die einfach einzuhalten sind. Darunter fällt auch der Punkt, dass eine Spalte in einer Tabelle nur atomare Daten enthalten soll. Speicherst du jedoch die merhfache Gruppenzugehörigkeit in einer Spalte, so sind die Informationen nicht mehr atomar. Und genau das handelt dir nachher z.B. bei Abfragen Probleme ein, denn mein like '1a;%' Vergleich ist alles andere als performant, und wohl fehleranfällig noch obendrein.

S
443 Beiträge seit 2008
vor 15 Jahren

nur weils noch keiner erwähnt hat, der 3. Normalfall sollte (meiner ansicht nach) das Ziel sein.

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen

P
Private Paula Themenstarter:in
31 Beiträge seit 2006
vor 15 Jahren

Na da sag ich doch mal brav "DANKE". Der Entwurf von Jelly funktioniert zwar (wenn man die 2. Codezeile weglässt), ich ich sehe auch jetzt schon die angesprochenen Probleme auf mich zukommen. Deshalb werde ich Euren Rat befolgen und das ganze umbauen. Ich muss gestehen bis jetzt habe ich mir um DB-Design nicht wirklich Gedanken gemacht, werde ich aber schleunigst abstellen solange es noch geht. Wie gesagt, besten Dank für Eure Unterstützung.

Gruß Paula

J
1.114 Beiträge seit 2007
vor 15 Jahren

Die Entscheidung kann ich nur befürworten. DB Design änderungen in einer späteren Phase des Projektes sind oftmals ein Ding der Unmöglichkeit. Wie gesagt.... Zumindest die ersten 3 Normalformen sollten definitiv erfüllt sein.

S
443 Beiträge seit 2008
vor 15 Jahren

vielleicht nur so am Rande, kann sein das ich mit meiner Meinung alleine da stehe.

ich mache auch, um die Ergebnisse der Joins zu erleichtern, die Feldnamen eindeutig.
Hier mal meine Regeln:
Jede ID spalte bekommt zusätzlich das Kürzel der Tabelle
Jede Spalte beginnt mit dem selben Kürzel
Die Trennung zwischen Kürzel und Spaltennamen ist ausschliesslich ein ''
Es darf nur ein '
' im Spaltennamen vorkommen, Ausnahme:
Es ist ein Beziehungsfeld.
Zwischentabellen (n:m) beginnen mit LUT und beinhalten die Kürzel der Tabellen die mit dieser verwiesen sind, trennung erfolgt mit ''
Es sind keine anderen Sonderzeichen als '
' erlaubt. Zahlen zur Nummerierung deuten auf ein schlechtes Design.

Soweit die Regel, nun die Praxis:
Adressen:
LfdNr_Adr
Adr_Name

AdressKategorien
LfdNr_AdrKat
AdrKat_Name

LUT_Adr_AdrKat
LUT_LfdNr_Adr
LUT_LfdNr_AdrKat

Aufruf:
SELECT LfdNr_Adr, Adr_Name, AdrKat_Name FROM (Adressen LEFT JOIN LUT_Adr_AdrKat ON Adressen.LfdNr_Adr = LUT_Adr_AdrKat.LUT_LfdNr_Adr) LEFT JOIN AdressKategorien ON LUT_Adr_AdrKat.LUT_LfdNr_AdrKat = AdressKategorien.LfdNr_AdrKat

damit habe ich zwei Namen Spalten und ich weis noch immer welche wohin gehört
ohne Tabellenkürzel hat ein DataTable zwei Spalten mit der Bezeichung 'Name' was zu Probleme führen könnte.

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo spike24,

vielleicht nur so am Rande, kann sein das ich mit meiner Meinung alleine da stehe.

Du stehst nicht alleine mit dieser Überzeugung 😁 mache das genauso, lediglich mit anderen Abkürzungen.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

J
1.114 Beiträge seit 2007
vor 15 Jahren

Dito 👍
Gerade wenn mehrere Leute an der DB ihre Abragen absetzen erhöht das immens die Übersicht...

Meine Abkürzungen sind auch etwas anders.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Sicher sollten vernünftige Namen gewählt werden, aber bitte nicht solche komischen Abkürzungen.

Was spricht zb gegen ein TabellenameID?
Das lässt sich auch einfach generieren.

Diese Abkürzungswut kommt aus einer Zeit, als bei Basic tatsächlich die länge
der Variablennamen einen Teil der Performance ausmachte, ist aber nicht mehr zeitgemäss.

S
443 Beiträge seit 2008
vor 15 Jahren

bin ich ganz auf Deiner Seite, beim Programmieren mit der Intelisens macht das keinen Unterschied mehr, ob ich kurze oder lange namen nehme (ausser beim lesen), da ich ja sowieso nicht mehr als drei Zeichen schreibe, da kommt auch schon mal der Name BusinessObjectCommandParams vor.
Aber in den SQL-Statments muss ich das ja alles selber tippsen und wenn ich da so ein Join über 10 Tabellen (für eine Auswertung) bastle und ich LUT_Adressen_AdressKategorien schreiben muss, oder LUT_Room_AnlagenKennzeichnungSystem_AnlagenKennzeichnungSystemSub, sehe ich noch einen Vorteil bei den Kürzeln

Aber hier möchte ich auf das "Drei Schichten Model" von vbArchiv verweisen.

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen

J
1.114 Beiträge seit 2007
vor 15 Jahren

Tja, so unterscheiden sich die Welten... Und ich als Physiker würd am liebsten meine Variablen und DBFeldnamen mit griechischen Buchstaben abkürzen 😁

Im ernst:
Im DB Umfeld ist bei mir der PK immer <Tabellenname>Id. Das ist auch schon eigentlich die Hauptkonvention die ich wirklich durch all meine Projekte durchziehe. Die Id Spalte mutiert dann allerdings in meinen OR-Wrapperklassen schon mal zu einer simplen Id. Auf der Ebene gibt es ja auch keine Probleme. Aber gerade beim Manipulieren und Formulieren von Select Abfragen machen gewisse Konventionen schon Sinn. Aber jetzt für jedes DBFeld einer Tabelle in irgendeiner Form den Tabellennamen als Prä- oder Suffix mitzuschleppen halte ich deutlich für übertrieben.

F
10.010 Beiträge seit 2004
vor 15 Jahren

@spike24:
Kein guter vergleich, da dir dazu die 20 Jahre fehlen, die Melkor und Ich dir vorraus haben.

S
443 Beiträge seit 2008
vor 15 Jahren

Ich habs eher auf "Du wirst mich nicht überreden können, und ich Dich nicht" bezogen, dass ihr beide noch weit vor mir seit ist und war mir immer klar.

aber 8 Jahre habe ich schon, bald habe ich euch eingeholt 🙂

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen