speichern in normalisierte db

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • speichern in normalisierte db

    Hallo zusammen!

    Ich hätte da eine Frage, und hoffe dass ihr mir weiter helfen könnt!

    Ich habe eine mysql DB in 3ter Normalform. Deshalb habe ich folgende Tabellen

    tabelle1
    ======
    id
    attribut1
    attirbut2

    tabelle2
    =====
    id
    t1_id (FK)
    attributa
    attributb

    Nun möchte ich mit php einen datensatz in Tab1 erstellen mit mehreren zugehörigen einträgen in t2.

    Wie mach ich das am besten, da, ich beim speichern ja nicht weiss, welche id der tabelle1 ich in den foreign key bei t2 eintragen soll...

    Danke schon mal für eure Anregungen!!

    Gruss!

  • #2
    am besten wie ein newsscript mit kommentaren.
    eine tabellen mit news und einer id und eine zweite tabellen mit kommentaren die einer newsid zugeordnet sind.

    ----tabelle 1----
    id
    name
    ...


    ----tabelle 2----
    id
    newsid
    name
    .....

    die id aus der ersten tabellen hängt mit der newsid aus der zweiten tabelle zusammen. Also wenn du Kommentare angezeigt haben willst, dann wählst du alles aus mit der id der news.

    MfG
    Bauer

    Kommentar


    • #3
      @Bauergiesen: argl.

      @pac_sun:

      Code:
      BEGIN ... 
      INSERT INTO tabelle1 (attribut1, attribut2) VALUES  ... ;
      INSERT INTO tabelle2 (t1_id, attributa, attributb) VALUES (
         SELECT LAST_INSERT_ID() FROM tabelle1,
         'bla',
         'blubb'
      );
      COMMIT ...
      ... wenn du eine ältere mysql-version hast (die keine subselects kann), kannst du alternativ auch über php erst die LAST_INSERT_ID() holen, und dann den zweiten query aufbauen.

      grüße
      axo

      Kommentar


      • #4
        @axo:

        Vielen Dank, genau sowas hab ich gesucht!!

        Das mit last_insert_id() wirds dann wohl auch für Updates geben. Werde dies aber mal im mysql handbuch nachschlagen!...

        Das mit den Subselects sollte kein Problem darstellen!(mysql 5.x)

        Gruss, pac_sun



        Hmmm... hätte wohl eher in die Rubrik "Datenbank" gehört.....!

        Kommentar


        • #5
          Zur Info:

          Hab im Gespräch mit einem befreundeten Applikationsentwickler noch eine andere Lösung erhalten:

          Diese Lösung minimiert das Risiko, dass zwei gleichzeitig speichernde die selbe "last_id" lesen.

          - Autoincrement aus T1 entfernen
          - Neue Tabelle "idressource" erstellen, mit einem integer-wert

          idresource
          ========
          ID
          Nummer

          - beim Speichern der Daten den Wert des Feldes Nummer auslesen und gleich um eins erhöhen.

          - den ausgelesenenwert aus idresource.nummer als id bzw. ForeignKey in t1 und t2 benützen.

          Kommentar


          • #6
            Original geschrieben von pac_sun
            - beim Speichern der Daten den Wert des Feldes Nummer auslesen und gleich um eins erhöhen.
            Gleich i.S.v. gleichzeitig geht nicht, denn beim Lesen kannst du nicht schreiben. Für die Isolation (das I in ACID) mußt du in diesem Fall selbst sorgen, DB-seitig ginge das mit LOCK.

            Kommentar


            • #7
              ja, die sequence-tabelle ist schön und gut - in manchen db-systemen (die z.b. auto-increment nicht unterstützen) ist das auch die einzige möglichkeit.

              gleichzeitigkeit geht in dem fall aber nicht, denn mit BEGIN und COMMIT wird eine transaktion erzeugt, die sowas ausschließt.

              grüße
              axo

              Kommentar


              • #8
                ja, klar gleich zeitig geht nicht...

                Hätte eher "gleich danach" heissen sollen. (Man soll ja nicht schneller tippen als man denkt....)


                Danke nochmals für die Lösungsansätze!! Funktioniert mittlerweile super!

                Kommentar

                Lädt...
                X