Announcement

Collapse
No announcement yet.

Struktur einer Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Struktur einer Tabelle

    Hi, ich bin gerade dabei eine mySql DB der 5er Version zu erweitern. Engine ist InnoDB. Ich habe zur Zeit folgende 3 Tabellen :

    shapes
    volumes
    labels

    Die stehen folgendermaßen miteinander in Verbindung:

    shapes - 1 --- n - labels - n --- 1 - volumes.
    Dies ist über foreign keys abgesichert.

    Nun mein Problem:

    Ich brauche eine Tabelle "plans", die verschiedene Pläne enthält, die weiter eine Liste von 'parts' besitzen. Diese parts können entweder shapes oder volumes sein.
    Wie modelliere ich das?

    Eine Tabelle 'parts' mit einer planID, shapeID und einer volumeID? wie kann ich dann sicherstellen, dass nur entweder shapeID oder volumeID ungleich null sind?
    Oder gibts einen intelligerenen Vorschlag?

    Danke für eure Hilfe!
    Zuletzt editiert von malloc(o); 25.08.2009, 02:08.

  • #2
    Ich würd jetzt sagen das kommt darauf an welche Trennung Dir wichtiger ist.

    Entweder Du teilst das so auf wie Du es oben hast. Und dann würde ich eine Tabelle PlanShapes und PlanVolumes machen (also das nicht als eine Menge Teile betrachten, sondern zwei)

    Oder Du fasst Shapes und Volumes in eine Tabelle zusammen und lässt je nach Bedarf bestimmte Felder leer.

    Ich würde Dir (sofern es der Rest zulässt) zu ersterem Ansatz raten.

    Gruß
    fanderlf

    Comment


    • #3
      Danke für die Antwort.

      Das Zusamenfassen von shapes und volumes in eine Tabelle kommt nicht in Frage.

      Ich werden das wie von Dir vorgeschlagen Umsetzen.

      Eine Tabelle 'plans', eine partShapes und eine partVolumes.

      plans
      id
      name
      ...

      partshapes
      id
      planID
      shapeID

      volumeShapes
      id
      planID
      volumeID

      Hast Du noch einen Tipp, wie ich in einem solchen Plan eine feste Reihenfolge von shapes und voumes definieren kann?

      Also beispielsweise sowas:
      mainplan -> parts: partshape3, volumeshape2, volumeshape3, volumeshape1, partshape2, pahtshape4

      Comment


      • #4
        füge den tabellen partshapes und volumeshapes noch eine spalte position hinzu:

        partshapes
        id
        planID
        shapeID
        position

        volumeShapes
        id
        planID
        volumeID
        position

        Allerdings steuert dann das Programm wieder die positionslogik und ist auch dafür verantwortlich, dass die Positionen immer eindeutig sind.
        Allerdings kann man z.B. einen UniqueConstraint über planID + Position bauen, der dafür dass ein Volume in einem Plan schon bloß mehr eine Position haben kann.

        Über kompliziertere Konstrukte ließe sich das bestimmt auch anders lösen, allerdings ist das dann nicht sehr gut für die Performance.

        Comment


        • #5
          Genau mit so einer Positionsvariablen hab ich das zwischenzeitlich gelöst.

          Das mit dem UniqueConstaint ist eine gute Idee. Kann ich das auch in phpMyAdmin anlegen, oder soll ich mich mal durch das Handbuch wühlen? ;D

          Besten Dank

          Edit:
          ALTER TABLE myTable ADD UNIQUE (eins, zwei);
          Zuletzt editiert von malloc(o); 25.08.2009, 13:44.

          Comment


          • #6
            Lediglich das Problem, dass Positionen noch nicht eindeutig seinen müssen, wenn zwar das UniqueConstraint funktioniert, aber nicht sicherstellt, dass es nicht shapes und volumes mit einer identischen position gibt.

            Kann man UniqueConstraints auch über 2 Tabellen anlegen? Oder ist dafür dann das Programm zuständig?

            Comment


            • #7
              puh ich komme aus der Oracle Welt und soweit ich weiss bezieht sich ein Constraint auf immer nur auf eine Tabelle.
              Es ist natürlich auch abzuschätzen was denn überhaupt passieren kann, wenn die Positionen nicht zusammen passen. Oder man baut sich eine Stored Procedure die die Shape Reihenfolge prüft und sie nur bei Erfolg in die DB schreibt.
              Alternativ kann man solche eine Prüfung auch im Programm vornehmen. Kommt immer darauf an welchen Umfang das ganze wahrscheinlich annehmen wird.

              Comment


              • #8
                Die Daten der Tabellen werden sehr überschaubar sein und jeweils noch im zweistelligen Bereich liegen. Abgerufen werden diese Daten relativ oft werden, geändert aber sehr selten.

                Ich denke, das sinnvollste ist es, das Positionsproblem mit php zu lösen.


                Besten Dank und viele Grüße

                Comment

                Working...
                X