Verknüpfungstabellen - Verständnisfrage

M

merovinger

Guest
Hallo.

Ich bin angafangen mich in PostgreSQL einzuarbeiten. Verwendet wird pgAdmin natürlich.
Eine Datenbankstruktur habe ich bereits erstellt. Daten sind auch schon drin. Siehe unten.

Jetzt habe ich eine Verständisfrage zu Verknüpfungstabellen oder Auflösungstabellen die das Probelm der n:n -Beziehung beheben.
Meine Idee hierzu war eine Tabelle mit den entsprechenden Spalten zu erstellen und die dann als Fremdschlüssel zu den jeweiligen anderen Tabellen zu referenzieren.
Macht man das so ? Bin aktuell ein wenig verweirrt.
Ich hatte auch noch die Idee die beiden Spalten als zusammengesetzten Primärschlüssel zu erstellen.
Daraus müsste sich ja dann ergeben das die Spalten automatisch mit den Daten der verknüpften Primärschlüssel füllen. Oder nicht ?

Helft mir mal bitte meinen Knoten im Hirn zu lösen.

Merci.

1674905114667.png
 
Werbung:
Ein Fremdschlüssel (Foreign Key) und ein Primärschlüssel (Primary Key) sind erstmal eine logische Angelegenheit. Wie man vermuten kann beginnt alles mit dem Primärschlüssel. Oder mit 2en in 2 verschiedenen Tabellen.
Will man diese über eine N:N Tabelle verbinden, gehört zu jedem PK ein FK in der Verknüpfungstabelle, macht minimal 2 Spalten.
Während nun ein Primärschlüssel als Wert in einem Datensatz automatisch entstehen kann (durch Sequenz-Trigger oder Autoincrement Typen), geschieht das bei einem FK natürlich nicht. Nur der Ersteller (meist das Clientprogramm) weiß, welche PK in dem N:N Datensatz referenziert werden müssen. Hat man also jeweils einen PK aus 2 Tabellen und möchte sie N:N verknüpfen, müssen diese beiden PK Werte in der N:N Tabelle eingetragen werden.
Dieser Vorgang wiederum bedeutet, dass zum Zeitpunkt der Erstellung des N:N Datensatz die beiden PK Werte bekannt, also eingetragen worden sein müssen. In Postgres (und anderen DB) kann man diese Werte ganz bequem per RETURNING Clause beim Insert der PK Werte zurückgeben lassen und für das Insert in der N:N Tabelle verwenden.
 
Ich hab Dein Diagramm erst nach dem vorigen Beitrag gelesen.
Was Du nun N_N modelierst und was 1:N hab ich oben nicht beschrieben. Das geht auch nicht so einfach. Klassisch spricht man ja bei der Modellierung von den Normalformen, Redundanzfreiheit usw.
Auf den ersten Blick scheint mir Dein Modell bspw. unsauber bei den Sparten. Das gilt aber nur, wenn man lediglich eine Sparte zuordnen möchte. Für mehrere Sparten wäre es ok. Wie auch immer, die Modellierung macht man idR erstmal DB unabhängig, ein logisches Modell. Anschließend wird es in ein physisches Modell verwandelt. Das wird aber auch häufig vermischt bzw. übersprungen, wenn man sowieso schon eine DB gewählt hat, mit Generatoren arbeitet usw.
 
Danke für deine Rückmeldungen.
Leider bringt mich das jetz gar nicht weiter.
Ich recherchiere nochmal.
 
Leider bringt mich das jetz gar nicht weiter.
Was genau ist denn Dein Problem? Ganz allgemein: Du hast eine Tabelle mit einem Primary Key, und dann kann Du eine weitere Tabelle haben, die diesen Primary Key als Foreign Key nutzt, um beliebig viele Referenzen auf die erstere Tabelle zu definieren.

Mal als Beispiel: Du hast Artikel und Hersteller. Es kann für einen Artikel 0 oder mehrere Hersteller geben, jeder Hersteller hat für einen spezifischen Artikel einen spezifischen Einkaufspreis:

Code:
postgres=# create table artikel (artikelnummer int primary key, name text);
CREATE TABLE
postgres=# create table hersteller(hersteller int primary key, name text);
CREATE TABLE
postgres=# create table hersteller_artikel(hersteller int references hersteller, artikel int references artikel, einkaufspreis numeric, primary key (hersteller,artikel));
CREATE TABLE
postgres=#

Ist es das, was Du suchst?
 
Nein das habe ich nicht gesucht.
Ich denke ich habe meinen Denkfehler gefunden. Wissen tue ich es nicht.

Ich versuche seit 2h Daten in eine Spalter einer bestehenden Tabelle einzufügen. Ich habe im Netz auch nichts passendes gefunden.
2h um eine Abfrage zu suchen. Oh man.

Ihr wisst das bestimmt adhoc.
PK ist auto increment. Jetzt will ich 30 Datensätze in einer Spalter einfügen ohne das Mr. Datenbank neue Zeilen unter die bestehenden einfügt.
30 Datensätze sind aktuell vorhanden. Als ich versucht habe eine Zeile einzufügen hat Monsieur Zeile 31 erzeugt.
Kann ich nix mit tun. Soll er er auch nicht machen. Scheinbar ein Kommunikationsproblem.
 
Kann ich nix mit tun. Soll er er auch nicht machen. Scheinbar ein Kommunikationsproblem.
ja, schwer zu verstehen was Du willst. Vielleicht sowas?

Code:
postgres=# create table master (id int primary key, name text);
CREATE TABLE
postgres=# create table detail (master int references master, val int);
CREATE TABLE
postgres=# 
postgres=# 
postgres=# insert into master values (1, 'max');
INSERT 0 1
postgres=# insert into master values (2, 'susi');
INSERT 0 1
postgres=# insert into master values (3, 'willi');
INSERT 0 1
postgres=# insert into master values (4, 'hugo');
INSERT 0 1
postgres=# with id as (select id from master where name = 'willi' ) insert into detail select id, 25 from id; 
INSERT 0 1
postgres=# select * from master ;
 id | name  
----+-------
  1 | max
  2 | susi
  3 | willi
  4 | hugo
(4 rows)

postgres=# select * from detail ;
 master | val 
--------+-----
      3 |  25
(1 row)

postgres=#

Falls nicht: schildere bitte NACHVOLLZIEHBAR, was Dein Problem ist.
 
Vielleicht kannst Du Dich mal mit ein paar Begriffen anfreunden. Zeilen werden eingefügt (Insert), Spalten werden aktualisiert (Update).
Womit wird eingefügt oder aktualisiert, mit Daten, die aus anderen Tabellen kommen (z.B. Foreign Keys, die eins zu eins dem Primary Key einer anderen Tabelle entsprechen) oder mit Benutzereingaben, die idR. über ein Clientprogramm erfasst werden.
Wenn Du die richtigen Begriffe verwendest (erlernst), wird auch Deine Suche erfolgreicher. Besonders, wenn Du es gleich auf Englisch machst.
 
Werbung:
Wenn Du konkret die VerlageID eines (offenbar) Buchs eintragen möchtest, musst Du das Stück für Stück mit menschlicher Intelligenz eintippen, eine Händler / Verlags DB / Katalog anfordern in der beides (Buch, Buchtitel und Verlag) in einem Datensatz denormalisiert gespeichert sind oder diese Informationen aus einer anderen Quelle, die sich bereits in Deinen Tabellen findet, ableiten.

Wenn Du also irgendwo Buchtitel UND Verlagsname in einer Tabelle verfügbar hast, müssen diese Daten mit Deinen Zieltabellen gejoint werden und per Update dann die zugehörige VerlageID in Deine Artikeltabelle eingefügt werden.

Und auch noch als Hinweis: Wenn Du "diese Tabelle" hast, ist es hilfreich, sie zu benennen, damit alle wissen, was "diese Tabelle" beinhalten soll. Man kann sich auch alle Spalten ansehen und fabulieren, was es sein soll, aber das ist kontraproduktiv / fehleranfällig / missverständlich.
 
Zurück
Oben