Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Relation auf SQL-Server


Christoph1972 - Fr 25.05.12 21:49
Titel: Relation auf SQL-Server
Hallo zusammen,

ich habe mal wieder die Ehre dass ich eine Anwendung mit einem SQL-Server im Hintergrund entwickeln darf. Da ich mich immer nur sporadisch mit SQL und DB-Servern befassen kann, brauche ich mal wieder eure Hilfe.

Also, für die Anwendung benötige ich zwei Tabellen.

Eine Tabelle die Informationen zu Prüfmethoden bereitstellt, hier liegt mein Focus bei der Einheit des Ergebnisses.


Table:A

Quelltext
1:
2:
3:
4:
5:
PNAME       UNIT        usw……
-----------------------------
Xyz          Kg
Abc          g
Nbv          ppm


Und eine Tabelle die Ergebnisse der Prüfungen hält.

Table:B

C#-Quelltext
1:
2:
3:
4:
DATE    PNAME   VALUE    UNIT   usw……
01.12   Xyz     18       Kg
02.12   Abc     20       g
03.12   Nbv     100      ppm


So nun zur Problem/Fragestellung:

Ich möchte die Einheit nicht bei jedem Ergebniseintrag in die Tabelle B übergeben. Ich denke es sollte möglich sein, das der Server bei jedem Select auf Tabelle B, die Einheit aus der Tabelle A auslesen kann und zurückgibt oder? Ich sehe hier den Vorteil, das bei der Änderung der Einheit, die Änderung nur an einer Stelle durchgeführt werden muss und so soll das ja auch Grundsätzlich sein wenn möglich, oder?

Ich hoffe dass ich mich verständlich ausgedrückt habe und mir jemand einen Tipp geben kann wie dass zu realisieren ist. Das sollte doch mittels Relation gehen, oder? Meine Versuche haben bisher jedoch zu keinem Erfolg geführt.

Oder macht man das mittels Select auf auf beide Tabellen? :gruebel:

Ach so, ich arbeite mit SQL Management Express auf einem SQL-Server 2008 R2.


Th69 - Sa 26.05.12 10:23

Hallo Christoph,

ja, das nennt sich Datenbank-Normalisierung [http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29]
Entferne also die Spalte "UNIT" aus deiner 2. Tabelle und verwende zum Abrufen einen (Outer) Join [http://de.wikipedia.org/wiki/Outer_Join#Abfrage_mit_verkn.C3.BCpften_Tabellen].
Datenbanktechnisch solltest du dann selbstverständlich einen ForeignKey von B.PNAME auf A.PNAME getetzt haben, damit du immer eine Verknüpfung zu der UNIT herstellen kannst. Ansonsten würdest du einen Left oder Right Join benötigen, um auch Daten aus B ohne Verknüpfung zu A selektieren zu können.

Mit welcher Technik greifst du denn auf die DB zu (ADO.NET, Linq-to-SQL, EF, ...)?


Christoph1972 - Sa 26.05.12 13:16

Vielen Dank schon mal für die Info! Ich verwende ADO.Net.

Werde ich mir später anschauen, ich bin mal kurz 150Km Rennradfahren :-D


Christoph1972 - Di 29.05.12 21:31

Hallo,

ich habe heute mal experimentiert. Ich habe es bisher nicht hinbekommen, so wie ich mir das vorgestellt hatte. Ich habe die Spalte UNIT aus Tabelle B entfernt. Dann habe ich einen Fremdschlüssel von B.PNAME auf A.PNAME gelegt. (hier war ich mir nicht sicher das die Aktion korrekt ist, das ist der DataSet Designer vom VS besser, bzw. besser visualisiert.)

Geht das denn tatsächlich, dass ich die Einheiten mit einem einfachen Select gegen die Tabelle B erhalte?

Z.B.


Quelltext
1:
SELECT * FROM B                    


Result: (UNIT kommt hier aus Tabelle A)

Quelltext
1:
2:
3:
4:
DATE    PNAME   VALUE    UNIT   usw……
01.12   Xyz     18       Kg
02.12   Abc     20       g
03.12   Nbv     100      ppm



Ich habe jetzt eine andere Lösung, diese ist halt von der Grundidee etwas anders, aber sicher auch OK, oder?

(nur Exemplarisch)

Quelltext
1:
2:
3:
4:
SELECT  DATE, PNAME, VALUE, A.UNIT
FROM B, A
WHERE A.PNAME = B.PNAME
AND irgendwelche anderen Bedingungen…..


Was meint ihr, soll ich das so lassen, oder soll ich nochmal Energie in meine ursprüngliche Idee stecken? Es funktioniert ja soweit.........