*Markus: Insert bei Vererbung?

Hallo,

wenn ich folgende Vererbung habe...

wie fügt man dann eigentlich hier Werte ein, v.a. weil P_nr noch dazu ein Zähler ist?
Habe ich in "Person" einen Namen bereits stehen, hat dieser einen eindeutigen Primary key durch den Zähler.
Aber wie kann ich jetzt festlegen, welches kuerzel die Person mit der Nummer, zB 6 hat?
Ist das eine Art INSERT mit inner join? Ich finde erstaunlicherweise gar nichts über dieses Problem.

Markus

  1. yo,

    ich vermute mal, du suchst einen funktion, die dir die id der letzen insert anweisung gibt. wie die funktion genau heisst, ist abhängig von deinem dbms.

    PS: Vererbung ist nicht wirklich ein treffender begriff bei rdbms

    Ilja

    1. Hallo,

      man könnte das Ganze natürlich auch als 1:n-Beziehung von Person aus gesehen betrachten. Auch hier wäre der FK von Mitarbeiter der PK von Person. Der PK ist ein Zähler (=Typ SERIAL).
      Füge ich Personen, dh Vorname (vn) Nachname (nn) in "Person" ein, so klappt das. Aber von "Mitarbeiter" aus komme ich nie an die Namen in "Person" heran, aber wie funktioniert diese INSERT-Anweisung dann, um der Person "Max Mustermann" mit der P_nr "2" ein MA_kuerzel geben zu können? Das muss doch ein ganz allgemeiner Datenbanksachverhalt sein?

      Markus

      1. Oder andere Frage dazu:

        Macht man das überhaupt so? Oder sollte ich so vorgehen, dass ich überall einen Integer als Primärschlüssel nehme, ich dann jede Tabelle extra befülle, mit dem gleichen Primärschlüssel versteht sich, sodass diese Verknüpfungsdaten dann einfach mit einer SELECT-INNER-JOIN-Anweisung beim Abfragen kombiniert ausgegeben werden können?

        Markus

        1. echo $begrüßung;

          Macht man das überhaupt so? Oder sollte ich so vorgehen, dass ich überall einen Integer als Primärschlüssel nehme, ich dann jede Tabelle extra befülle, mit dem gleichen Primärschlüssel versteht sich, sodass diese Verknüpfungsdaten dann einfach mit einer SELECT-INNER-JOIN-Anweisung beim Abfragen kombiniert ausgegeben werden können?

          Mir scheint, du hast ein generelles Datenstrukturierproblem. Gib doch mal an, was du alles für Daten festhalten willst, dann können dir die Datenbankauskenner sicher ein paar Vorschläge zur Aufteilung geben.

          echo "$verabschiedung $name";

          1. Hallo,

            Mir scheint, du hast ein generelles Datenstrukturierproblem. Gib doch mal an, was du alles für Daten festhalten willst, dann können dir die Datenbankauskenner sicher ein paar Vorschläge zur Aufteilung geben.

            Danke für deine Hilfe, aber Daten modellieren liegt es aber nicht. Mein Problem ist, dass ich nicht genau weiß, wie sich Zähler als Schlüssel verhalten, also wie sich der Primärschlüssel auf den Fremdschlüssel auswirkte, aber ich denke, dass ich es allmählich behirne, da ich in den letzten Stunden damit herumexperimentierte.

            Markus

      2. echo $begrüßung;

        Füge ich Personen, dh Vorname (vn) Nachname (nn) in "Person" ein, so klappt das. Aber von "Mitarbeiter" aus komme ich nie an die Namen in "Person" heran, aber wie funktioniert diese INSERT-Anweisung dann, um der Person "Max Mustermann" mit der P_nr "2" ein MA_kuerzel geben zu können?

        SQL: SELECT P_nr FROM Person WHERE P_vn='Max' AND P_nn='Mustermann'

        andere Sprache: $nr = fetch()

        SQL: INSERT INTO Mitarbeiter (MA_P_Nr, MA_pass, MA_kuerzel) VALUES ($nr, '...', '...')

        Was ist dein Problem? Willst du die ID direkt per SQL ermitteln und weiterreichen? Vielleicht per Subselect statt $nr anderweitig zu ermitteln? Oftmals hat man ja $nr sowieso schon in einer Variablen, z.B. wenn man eben erst den Person-Eintrag eingefügt hat.

        Übrigens: Deine Spaltennamen sind ... ich meine: haben starkes Verbesserungspotential. Abkürzungen, soweit sie nicht allgemein gängig sind, finde ich schwer lesbar, weil sie sich nicht unbedingt selbst erklären. Die Zugehörigkeit einer Spalte ist bereits dadurch gegeben, dass sie in einer Tabelle steckt. Da muss sie nicht noch extra gekennzeichnet werden. Wenn es Zweifelsfälle gibt, kann man den Tabellennamen oder ein Alias angeben.

        echo "$verabschiedung $name";

        1. Hallo,

          allmählich glaube ich, dass ich einfach schon zu kompliziert denke.
          Vielleicht liegt's daran, dass ich schon den halben Tag lang an einem umfangreichen Datenmodell feile.

          Markus

    2. Hello,

      PS: Vererbung ist nicht wirklich ein treffender begriff bei rdbms

      mag sein, dass ihr hier alle recht habt, aber Datenbanken unterstützen Vererbung von Tabellen...Quelle hab ich gerade nix brauchbares, aber das hier ist eine Möglichkeit, wobei es mittlerweile sogar eine Syntax laut SQL-Standard gibt: Inheritance in PostgreSQL

      MfG
      Rouven

      --
      -------------------
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
      Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
      1. yo,

        mag sein, dass ihr hier alle recht habt, aber Datenbanken unterstützen Vererbung von Tabellen...

        ich bin zu alt für so was und halte nicht wirklich viel davon  ;-)

        meine erfafahrung ist die, ich würde objekt-eigenschaften nicht versuchen in ein rdbms zu intergrieren, da verliert man mehr, als man gewinnt.

        Ilja

  2. Hallo *Markus,

    wie fügt man dann eigentlich hier Werte ein, v.a. weil P_nr noch dazu ein Zähler ist?

    Normalerweise gibt es etwas wie SELECT last_insert_id(); (Ich glaube bei MySQL gehört es so). Außerdem ermöglichen mache DB-APIs solche generierten Werte abzufragen (bei JDBC geht das meines Wissens). Vermutlich gibt es auch irgend etwas in einem neueren SQL-Standard, wobei das MySQL, wenn Du das denn verwendest, wohl eher nicht unterstützt.

    Die ID über den Namen zu bestimmen, ist keine gute Idee. Es kommt durchaus vor, dass Leute den gleichen Vor- und Nachnamen haben.

    Was die Datenbank angeht: Manche Datenbanken können tatsächlich Vererbung zwischen Tabellen darstellen. Da kannst Du dann direkt ein Insert in die abgeleitete Tabelle machen.
    Allerdings ist Vererbung nicht unbedingt das richtige Konzept. Eine Person kann bspw. Mitarbeiter mehrere Unternehmen sein o.ä. weswegen man bei solchen Sachen wirklich meist besser in normalen Assoziationen denkt. Eine Person hat die Rolle "Mitarbeiter" für ein bestimmtes Unternehmen.

    Grüße

    Daniel

    1. Hallo,

      Die ID über den Namen zu bestimmen, ist keine gute Idee. Es kommt durchaus vor, dass Leute den gleichen Vor- und Nachnamen haben.

      Das stimmt, aber mein Schlüssel besteht ohnehin aus einer Sequence, wodurch der Primärschlüssel immer verschieden ist.

      Was die Datenbank angeht: Manche Datenbanken können tatsächlich Vererbung zwischen Tabellen darstellen. Da kannst Du dann direkt ein Insert in die abgeleitete Tabelle machen.

      Die Vererbung wird ja eig. ohnehin nur im Datenmodell als diese dargstellt, da das SQL-Script ganz normale Primär- und Fremdschlüssel anlegt. Ich verwende diese im Datenmodell, da diese die Beziehungen besser zum Ausdruck bringen.

      Übrigens, ich hätte da noch eine Frage, zu der ich aber kein extra Thema aufmachen will. Bei meinen Tests benutzte ich probehalber auch mal das Tool pgadmin3, um zu meiner PostgreSQL (lokal) eine Verbindung herstellen zu können.
      Bei meinen Versuchen habe ich die ganze DB gleich gelöscht und wieder per SQL-Script neu erstellt (geht schneller).
      Dabei passierte es mir plötzlich, dass beim Neuanlegen immer eine Tabelle "testtabelle", die ich mal irgendwo anlegte, in meiner Datenbank enthalten ist, obwohl diese hier nichts zu suchen hat.
      Kann sich das jemand erklären, wie die da plötzlich hinkommt? Es hat auf jeden Fall mit dem Tool pgadmin3 zu tun, denn das anhaken des Passworts bewirkte in der Datenbank, dass ich als Postgre-User plötzlich nicht mehr das Passwort angeben musste. Beim Entfernen des Häkchens musste ich mich, wie gewünscht, wieder normal einloggen.
      Verwunderlicherweise muss das Tool gar nicht laufen. Die Änderungen bleiben trotzdem bestehen, auch wenn ich das Tool nicht verwende.
      Die Frage ist eig. folgende: Wo stellt man bei PostgreSQL 8.3 ein, dass Tabellen beim Erstellen von Datenbanken nicht automaitsch miterstellt werden? Es ist nämlich tatsächlich so.