"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

AdventureWorks OLTP SQL Experten hier?

Chrissicom 26.05.2008 - 14:41 1146 8
Posts

Chrissicom

Rise of the Ryzen
Avatar
Registered: Jul 2006
Location: Falkensee
Posts: 1942
Ich bin grad am Entwurf einer Datenbank und beim lesen einiger Tutorials auch auf die AdventureWorks (OLTP) Beispieldatenbank aus MSSQL gestoßen. Ich versteh aber eines nicht ganz bei diesem DB Layout, wie füge ich denn da einen neuen Mitarbeiter ein?

Da gibts eine Tabelle HumanResources.Employee mit einer EmployeeID die kann ich automatisch generieren ok, dann referenziert dieser Tabelle aber per Foreign Key auf Person.Contact(ContactID) und Person.Address(AddressID). Die dürfen beide nicht NULL sein weil ein Employee ja auch eine Address und nen Contact braucht. Aber woher weiß ich denn nun was für Werte in ContactID bzw. AddressID sollen wenn ich den Mitarbeiter noch nichtmal angelegt hab in HumanResources.Employee und in Folge dessen auch noch kein Kontakt oder eine Addresse besteht?!?! Bin da etwas verwirrt.

Ich find die Generalisierung ja insofern nich schlecht, als das sowohl Kunden wie auch Mitarbeiter Addressen haben, und ich so die ganzen gleichen Attribute nicht in zwei Tabellen habe sondern einer eigenen. Aber das einfügen is mir trotzdem ein Rätsel.
Bearbeitet von Chrissicom am 26.05.2008, 14:48

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
gscheiden threadtitle bitte, a sqlserver-demodb erfordert nur selten einen sql-experten :p

ich kenn jetzt das schema nicht, aber wenn du vo employee einen FK contactID und addressID hast legst du halt zuerst die neuen records in diesen tabellen an und erst dann einen neuen employee...

Chrissicom

Rise of the Ryzen
Avatar
Registered: Jul 2006
Location: Falkensee
Posts: 1942
Na ja das is aber etwas seltsame Logik wenn ich erstmal einen Kontakt (der keinen Namen sondern nur eine ContactID hat) erzeuge um dann einen Mitarbeiter mit diesem Kontakt zu erzeugen. Dann kommt ja noch dazu das die ContactID auto generiert ist, also weiß ich selbst beim anlegen eines Kontakts immer noch nicht welche ID ich nun benutzen soll, weil die ja sonstwie lauten kann.

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
vielleicht hast du ja bei einem neuen mitarbeiter schon einen existierenden contact/address, den kannst du so wiederverwenden... und mit SELECT SCOPE_IDENTITY() oder so kriegst du die zuletzt vergebene auto-id.

Chrissicom

Rise of the Ryzen
Avatar
Registered: Jul 2006
Location: Falkensee
Posts: 1942
Und was wenn ich 20 Kontakte anlege bevor ich den ersten Mitarbeiter anlege und dann den ersten Mitarbeiter mit dem als 7. angelegten Kontakt verknüpfen möchte, da bringt mir die neueste ID von den Kontakten nix. Ich glaube du machst dir das etwas einfach... ich suche schon nach einer Deppensicheren Lösung.

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
ich versteh nicht genau auf was du hinaus willst, will es offen gestanden auch nicht verstehen und wünsch noch weiterhin viel spaß ;)

Chrissicom

Rise of the Ryzen
Avatar
Registered: Jul 2006
Location: Falkensee
Posts: 1942
Ich möchte wissen:
Wie füge ich einen Mitarbeiter ein und stelle die passende ContactID, AddressID fest egal um welches Szenario es sich handelt....

z.B. Mitarbeiter wird als erstes eingefügt, oder Kontakt/Adresse wird als erstes eingefügt, oder es gibt schon 20 Adressen etc.

Man könnte ja z.B. auch sagen ok man muss zuerst Adressen anlegen (dort sind Namen hinterlegt), aber wie finde ich nun die passende AddressID wenns schon 20 Adressen gibt wenn ich einen Mitarbeiter anlege. Natürlich ist das für mich als DB Admin relativ trivial weil ich ja einfach die Adressen durchschaun kann und mir die passende ID raussuchen, ein Endnutzer der mittels Frontend an die DB rangeht will das aber sicher nicht machen. Der will einen Mitarbeiter erzeugen der einen Kontakt und eine Adresse hat und sich nicht mit IDs rumschlagen.


EDIT:
Ok, da das ganze doch etwas komplizierter zu sein scheint, werde ich es doch so machen das ich die Adress/Kontakt Attribute direkt in die Mitarbeiter bzw. Kunden Tabelle mit rein nehme. Dann gibts die Attribute halt doppelt, aber ich muss ja sowieso extra Zeilen für Kunden und Mitarbeiter einfügen.
Bearbeitet von Chrissicom am 26.05.2008, 15:28

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14595
falls ich den thread grad auch nur ansatzweise verstanden hab würd ich dir nahe legen, dich mit datenbanken intensiver auseinanderzusetzen. dass du keine benutzer ohne adressen erzeugen kannst, kannst auf 2 wegen lösen: entweder du lässt den adressen fremdschlüssel nullable oder du gibst deinen usern ein GUI, mit dem sie sich durch die bereits existenten adressn klickn können.

dazwischn gibts nix.

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Zitat von Chrissicom
Da gibts eine Tabelle HumanResources.Employee mit einer EmployeeID die kann ich automatisch generieren ok, dann referenziert dieser Tabelle aber per Foreign Key auf Person.Contact(ContactID) und Person.Address(AddressID). Die dürfen beide nicht NULL sein weil ein Employee ja auch eine Address und nen Contact braucht. Aber woher weiß ich denn nun was für Werte in ContactID bzw. AddressID sollen wenn ich den Mitarbeiter noch nichtmal angelegt hab in HumanResources.Employee und in Folge dessen auch noch kein Kontakt oder eine Addresse besteht?!?! Bin da etwas verwirrt.

wenn es noch keinen mitarbeiter gibt, hat er auch noch keine (kontakt)adresse, dass hast du schon mal gut erkannt. und es weiß auch keiner, was da drinstehen soll, wenn es noch nicht drinsteht. :confused:

ich (und ich glaub DKCH und semtex auch) versteh einfach nicht, was genau deine frage ist? und generell bei datenbankdesigntechnischen sachen bitte nach möglichkeit immer ein er-modell posten, dann ist nicht alles so abstrakt. danke ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz