Primary Keys immer setzen?

Hallo!

Ich frage mich, ob das Setzen von Primary Key in einer Tabelle immer sinnvoll ist. Bsp.:

Ich möchte eine Tabelle mit Hersteller und seine Adresse machen. Da der Hersteller mehree Adressen hat bspw. verschiedene Produktionsstätten oder Zweigestellen. Modelliere ich HerstellerAdresse als seperate Tabelle. Ist es da notwendig ein Primary Key zu setzen? Ich meine es reicht ein Fremdschlüssel zu IDHersteller.

|Hersteller|
IDHersteller
Firmenname

|HerstellerAdresse|
IDHersteller
Straße
PLZ
Ort

Was meint ihr?

hallo

ich kann nur aus meiner erfahrung sprechen. in jedem projekt, in dem ich es verabsäumt habe, JEDER tabelle einen KÜNSTLICHEN primärschlüssel zu geben, habe ich es später bitter bereut. entweder musste ich mit viel aufwand nachträglich umstellen oder einen unsauberen workaround finden.

das verwalten der primärschlüssel kann zwar manchmal recht mühsam werden, normalerweise lohnt sich der aufwand aber.

natürlich kann man auch komplett ohne primärschlüssel leben. spätestens dann, wenn du duplikate löschen musst (fehlerfassungen) wird es aber kompliziert. zusammengesetzte primärschlüssel sind auch mühsam. und natürliche schlüssel haben ständig die tendenz, sich doch zu ändern, obwohl eben noch jeder befragte stein und bein geschworen hat, dass er sich niemals ändern kann - es sogar völlig undenkbar ist.

primärschlüssel müssen übrigens eindeutig sein. in deinem beispiel hättest du daher das problem, dass du nur genau eine adresse speichern könntest - das aufteilen in eine eigene tabelle daher sinnlos wäre. du benötigst dann ein zusätzliches attribut, dass den pk eindeutig macht. da kannste aber klein einen künstlichen schlüssel hernehmen.

lg
erwin

primärschlüssel müssen übrigens eindeutig sein. in deinem
beispiel hättest du daher das problem, dass du nur genau eine
adresse speichern könntest - das aufteilen in eine eigene
tabelle daher sinnlos wäre. du benötigst dann ein zusätzliches
attribut, dass den pk eindeutig macht. da kannste aber klein
einen künstlichen schlüssel hernehmen.

Hallo!

Kannst du mir das nochmal näher erläutern, warum ich nur eine Adresse in der Tab. HerstellerAdresse speichern kann? IDHersteller ist in der besagten Tab. ein Foreign Key. Und da ich in dieser Tab. keine Primär Schlüssel habe ist es doch egal. Sprich : Ich kann doch mehrere Adressen speichern.

Müsste ich einen Primärschlüssel erstellen, so hätte ich entweder

Composite Key aus Str, PLZ, Ort oder
einen künstlichen Schlüssel gewählt.

Da du sagst, dass es immer besser ist einen pk zu wählen, dann werde das auch machen ^^. Aber mir ging es um die Frage, warum ich nur eine Adresse speichern kann. Hoffe du findest die Zeit mir es verständlich zu erklären. Beste Grüße!

Kannst du mir das nochmal näher erläutern, warum ich nur eine
Adresse in der Tab. HerstellerAdresse speichern kann?
IDHersteller ist in der besagten Tab. ein Foreign Key. Und da
ich in dieser Tab. keine Primär Schlüssel habe ist es doch
egal. Sprich : Ich kann doch mehrere Adressen speichern.

Ja , aber versuch mal nur eine adresse zu ändern oder zu löschen.

DB Firma
FirmaA

DB Adresse
FirmaA Hamburg Schlosstr 66
FirmaA Hamburg Schlosstr 61
FirmaA Hamburg Schlosstr 61 a
FirmaA Hamburg Schlosstr 61 a Info:Hirschacker
FirmaA Hamburg Bernerweg 66
FirmaA Berlin Schlosstr 61 a

löschen wir alle mit FirmaA ?
ändern wir alle
1 ? 2 ? 3 kombinationen für eindeutigkeit ?? immer wieder mit Ort=XXX and Firma=XXX and Strasse =XXX and Info=XXX

und hoffen wir das sich da niemals 2 gleichen, was sie aufjedenfall tu en werden weil murphy es will.

DB Adresse
1 FirmaA Hamburg Schlosstr 66
2 FirmaA Hamburg Schlosstr 61
3 FirmaA Hamburg Schlosstr 61 a
4 FirmaA Hamburg Schlosstr 61 a Info:Hirschacker
5 FirmaA Hamburg Bernerweg 66
6 FirmaA Berlin Schlosstr 61 a

Änder Lösche IDX=1

suche in IDX=1

scheint mir irgentwie sicherer.

Und am wichtigsten ERZEUGE , was passiert wie gesagt wenn der PRimary Key existiert obwohl alle gesagt haben , das es niemals die gleiche Firma in der gleichen strasse im gleichen haus in der gleichen stadt geben wird.

Was passiert dann :smile: geben wir der sache einfach ein neuen FirmenNamen ???

Übrigens gehts doch eigentlich so

Tabelle Kunden
ID Name Firma

Tabelle Adressen
ID Adresse

Tabelle KundenAdressen
Kunden.ID AdressenID

da aber nicht jeder 3 Tabellen cool findet und die 3 Normalis…
auch nicht jeder anstrebt.

Machen viele
Tabelle Kunden
ID Name Firma

Tabelle Adressen
ID KundenID Adresse

das aber eigentlich nciht so dolle, redundanz
4 Firmen im selben haus , nun wird bei jedem die gleiche Adresse gespeichert.

Das ist eben das problem wenn man ohne Normalisierung vorgeht.
Die Datenbank wird künstlich aufgebläht und schlecht verwaltbar.

hallo

sorry - war zu ungenau bzw. habe dich falsch verstanden.

wenn deine adressen-tabelle nur den fk auf die firma hat und du diesen fk als pk definierst, kannst du nur eine adresse pro firma speichern. es sei denn, du definierst ein zusätzliches feld mit einer art zähler pro firma, die du zum pk dazuhängst.

mit einem eigenen pk und dem fk zusätzlich klappt es natürlich, beliebige adressen zur firma zu erfassen.

ach ja, einen composite pk aus praktisch allen spalten der tabelle zu machen, ist zumeist eher ungünstig. zumindest meiner erfahrung nach. ist leider schwer zu definieren: es gibt für beide ansätze (also ein künstlicher schlüssel oder ein oder mehrere natürliche schlüssel) für und wider. in meinen projekten war es bisher aber so, dass der aufwand, einen künstlichen schlüssel „mitzuschleppen“, recht gering ist. die probleme, die man aber ohne künstlichen schlüssel hat, teilweise einem über den kopf wachsen.

beispiel: meine anwendung basiert auf oracle und ist ursprünglich nur auf einem db-server gelaufen. dann kam eine zweite installation dazu, wobei die beiden installationen intensiv daten austauschen mussten. noch dazu kurzfristig, d.h. die anwendung umstellen war aussichtslos. also einfach per trigger alle änderungen an den tabellen mitprotokolliert und asynchron auf den jeweiligen anderen server verschickt. funktioniert überall prächtig, wo du einen künstlichen schlüssel hast und alle schlüssel in allen tabellen genau gleich heissen. bei einer tabelle habe ich mir den künstlichen schlüssel gespart und genau für diese tabelle musste ich einen workaround schaffen, der im endeffekt weitaus mehr aufwang gebracht hat, als das bisschen arbeit, dass ich mir ursprünglich gespart habe.

wenn deine anwendung recht klein ist, kannst du natürlich so überlegungen wie oben völlig ignorieren und wirst nie in ein problem reinlaufen. nur ich dachte bei meiner anwendung halt auch, dass sie recht klein ist und auch so bleibt…

lg
erwin

ps: präzisierung zum obigen problem mit den adressen: plz, ort und abgabestelle sind normalerweise ATTRIBUTE einer adresse. v.a. attribute, die sich grundsätzlich ändern können. solche attribute in einen pk aufzunehmen, ist immer gefährlich. der pk eines objekts solltes sich NIEMALS und unter KEINEN UMSTÄNDEN ändern. im endeffekt kommt man meist zu einem künstlichen schlüssel zurück, der absolut keine aussagekraft besitzt (ausser der, dass er eindeutig ist). da er keine aussage hat, kann er sich auch nicht ändern.

beispiel: bei personendaten wird gerne die svnr als pk herangezogen: die svnr ist per definition eindeutig und kann sich nicht mehr ändern.

denkste: die daten werden von sachbearbeitern eingegeben. und die machen tippfehler. natürlich kannst du über prüfsummen tippfehler vermeiden. aber dann kennt ein typ seine svnr nicht und gibt die seines vaters an - der vielleicht genau gleich heisst.

wir haben in unserem projekt das problem, dass wir auch ausländer erfassen müssen, die 1. keine svnr haben und 2. nicht mal ihr geburtsdatum wissen bzw. nachweisen können. für die werden offiziell (!) svnrn vergeben, die als datum den 01.13.09 beinhalten, also ein ungültiges datum - soviel zu prüfroutinen.

anderer klassischer fall: inzwischen gibt es derart viele geschlechtsumwandlungen, dass eine anwendung, die das geschlecht einer person nicht ändern kann, reichlich veraltet ist.

merke: nur weil er aus jetztiger sicht undenkbar ist, dass sich ein attribut einer person nicht ändert, heisst das noch lange nicht, dass es wirklich unmöglich ist. tippfehler und erfassungsfehler müssen jederzeit korrigierbar sein. scheinbar eindeutige attribute, die sich scheinbar nicht ändern können, als pk heranzuziehen, kann durchaus probleme machen.

Hi!

Übrigens gehts doch eigentlich so

Tabelle Kunden
ID Name Firma

Tabelle Adressen
ID Adresse

Tabelle KundenAdressen
Kunden.ID AdressenID

Whoa!! 3 Tabellen!! Sagt mal ist das in der Praxis so üblich oder ist das ein akademisches Problem??

…da könnte ich auch anfangen Namen als seperate Adresse zu speichern. Was ist denn, wenn mehrere Frimen den selben Namen haben. Ich frage mich wirklich, ob es in der Praxis so üblich ist 3 Tabellen nur für die Zuweisung von „Name“ zu „Adresse“ zu machen

Moin, asdf,

Whoa!! 3 Tabellen!! Sagt mal ist das in der Praxis so üblich

nein.

oder ist das ein akademisches Problem??

Nicht ganz: Adressverlage, die Adressen verkaufen, plagen sich mit sowas rum, weil sie Ärger bekämen, wenn sie die gleiche Adresse mehrfach verkauften. Jeder Versandhändler schickt im Zweifelsfall den Katalog doppelt, das kann er verschmerzen.

Gruß Ralf

…da könnte ich auch anfangen Namen als seperate Adresse zu
speichern. Was ist denn, wenn mehrere Frimen den selben Namen

siehe NormalForm 1

http://de.wikipedia.org/wiki/Normalisierung_(Datenba…

haben. Ich frage mich wirklich, ob es in der Praxis so üblich
ist 3 Tabellen nur für die Zuweisung von „Name“ zu „Adresse“
zu machen

siehe Normalform 2

http://de.wikipedia.org/wiki/Normalisierung_(Datenba…

zur dritten kommste damit bestimmt niocht :smile:

Moin,

zur dritten kommste damit bestimmt niocht :smile:

heißt das jetzt nicht oder noch?

SCNR :smile:))

Gruß Ralf

OT^8:
patologisch oder juristisch gesehen.

-)

suchs dir aus :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

patologisch oder juristisch gesehen.

dann nehm ich pattologisch, Juristerei ist so elend dröge :smile:))

Gruß Ralf