Announcement

Collapse
No announcement yet.

Frage bzgl. Relation in MS SQL DB - Lieferschein

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

  • Frage bzgl. Relation in MS SQL DB - Lieferschein

    Hallo,

    dies ist mein erster Post hier und bei folgenden Problem bräuchte ich Hilfe.

    Ich entwickle derzeit für mich selbst ein Programm das mir Lieferscheine erstellt - alles so weit kein Problem.
    Jetzt will ich die Daten nicht File-Based speichern sondern in eine SQL DB packen.
    Habe schon ein DB Modell erstellt komme aber mit den Variablen Produkten nicht zurecht - zumindest denke ich das es da eine viel bessere Methode gibt die Daten zu verknüpfen.

    Zur Vor-ab Info, ich bin nicht ganz der SQL Spezialist - darum bitte ich um ein wenig Nachsicht.

    Zu meinem Problem:

    Ich will einen Lieferschein Table haben, in diesem speichere ich Datum, Kunde_FID, etc. und natürlich die ausgewählten Produkte. <- Wie kann ich variable viele Produkte einem Lieferschein zuordnen? (die Produkte sind mit einer Eindeutigen ID in der Produkte Tabelle gelistet)
    Man kann in diesem falle ja nur eine Zwischentabelle erstellen - hier stehe ich an.

    Soll ich dann die Zwischentabelle wie im folgenden Beispiel aufziehen?
    Und was wenn einmal mehr Produkte kommen als Spalten vorhanden sind?
    Es können ja auch neue Produkte hinzukommen........

    [Lieferschein]
    LS_ID (PKey)
    LS_Datum
    LS_Kunde (FKey = PKey aus Kunden Tabelle)
    LS_Produkte (FKey = PKey aus Produkte_Zwischentabelle)

    [Produkte_Zwischentabelle]
    Pro_Zwi_ID (PKey)
    Produkt_1 (FKey = PKey aus Produkte)
    Produkt_2 (FKey= PKey aus Produkte)
    Produkt_3 (FKey= PKey aus Produkte)
    Produkt_4 (FKey= PKey aus Produkte)
    Produkt_5 (FKey= PKey aus Produkte)
    Produkt_6 (FKey= PKey aus Produkte)
    Produkt_7 (FKey= PKey aus Produkte)
    ...
    ...
    ...

    [Produkt]
    Produkt_ID (PKey)
    Produkt_Name
    Produkt_Einheit
    Produkt_Preis
    Produkt_Detail

    Habe leider NULL vertrauen in meine Methode da mir diese nicht sehr relational vorkommt.....

    Falls Ihr mehr Infos benötigt oder ich etwas unklar formuliert habe bitte ich um eine kurze Nachricht.
    Ich bedanke mich herzlichst bei jedem der mir hier weiterhelfen kann.

    Mit freundlichen Grüßen
    Sh0Xy

  • #2
    In dem du eine Tabelle "Lieferschein" hast und eine weitere Tabelle "Produkte". Das ist keine Zwischentabelle
    Jede Tabelle hat für jeden Datensatz eine eigene ID.
    Die Tabelle Produkte hat eine Spalte LieferscheinID. Für jeden Lieferschein wird dessen ID dort und das jeweilige Produkt in der Tabelle abgelegt

    https://de.wikipedia.org/wiki/Normal...ng_(Datenbank)

    Siehe 2. Normalform
    Zuletzt editiert von Christian Marquardt; 24.01.2020, 22:33.
    Christian

    Comment


    • Sh0Xy
      Sh0Xy commented
      Editing a comment
      Hallo Chrisitan,

      vielen dank für deine rasche Antwort, wenn ich das richtig verstanden habe, sollte dass dann folgend aussehen:

      [Produkte]
      Produkt_ID (PKey)
      Produkt_LS_NR (FKey = PKey von Lieferschein Tabelle)
      Produkt_Name
      Produkt_Einheit
      Produkt_Preis
      Produkt_Detail
      Produkt_Menge (Habe ich vorher vergessen einzufügen)


      Dann muss ich aber für jeden Lieferschein immer eine neue Zeile pro Produkt machen.
      Verbrauche ich dann nicht mehr Speicher & Performance als wenn ich das über eine Zwischentabelle löse?

      Da müsste ich ja diese Informationen wieder trennen...

      Komme aber auf folgende (für mich grundsätzlich schönere Lösung)

      [Lieferschein]
      LS_ID (PKey)
      LS_Datum
      LS_Kunde (FKey = PKey aus Kunden Tabelle)
      LS_Produkte (FKey = PKey aus Produkte_Zwischentabelle)

      [Produkte_Zwischentabelle]
      Produkt_Zwi_ID (PKey)
      Produkt_LS_NR (FKey = PKey von Lieferschein)
      Produkt_ID (FKey = PKey von Produkte)
      Produkt_Menge (Habe ich vorher vergessen einzufügen)

      [Produkte] (Hier werden die Stamm Infos der Produkte gespeichert)
      Produkt_ID (PKey)
      Produkt_Name
      Produkt_Einheit
      Produkt_Preis
      Produkt_Detail

  • #3
    Schreibe keine Kommentare, sondern einen neuen Beitrag im dem Thread!

    Dann muss ich aber für jeden Lieferschein immer eine neue Zeile pro Produkt machen.
    Ja
    Verbrauche ich dann nicht mehr Speicher & Performance als wenn ich das über eine Zwischentabelle löse?
    Nein
    Da müsste ich ja diese Informationen wieder trennen...
    ?? Wieso ??

    Komme aber auf folgende (für mich grundsätzlich schönere Lösung)
    Sicher nicht. Dann gib mal alle Produkte zu einem Lieferschein aus

    Ich würde mir ja so meine Gedanken machen, wenn es schon erprobte Lösungen und Verfahren gibt
    Christian

    Comment


    • #4

      Ich kann mir aber nur schwer vorstellen warum ich x male den Namen des Produkts + Einheit + Detail abspeichern soll. Dazu kommt noch das ich die Datenbank nicht als Master für meine Produkte benutzen kann, da ich ja keinen eindeutigen Stamm in der Produkte Tabelle mehr habe.... und Hardcoded ins Programm die Produkte zu schmeißen ist nicht sinn der Sache...

      Habe das mit dem Kommentaren grade erst gelesen sry

      Comment


      • #5
        Wenn du mit Produkte die Tabelle meinst, in der "alle" Produkte aufgelistet sind (der Bestand), dann ist dein Vorgehen richtig.
        Das habe ich dann falsch verstanden. Habe das so aufgefasst, das die Produkte nur die aus dem Lieferschein sind.
        Christian

        Comment


        • #6
          Da habe ich mich bisschen unklar ausgerückt - somit ist die beste Lösung eine Zwischentabelle zu erstellen und in dieser die ID's der Produkte zu speichern?

          Also wie mein zuerst vorgeschlagenes Modell?

          [Lieferschein]
          LS_ID (PKey)
          LS_Datum
          LS_Kunde (FKey = PKey aus Kunden Tabelle)
          LS_Produkte (FKey = PKey aus Produkte_Zwischentabelle)

          [Produkte_Zwischentabelle]
          Pro_Zwi_ID (PKey)
          Produkt_1 (FKey = PKey aus Produkte)
          Produkt_2 (FKey= PKey aus Produkte)
          Produkt_3 (FKey= PKey aus Produkte)
          Produkt_4 (FKey= PKey aus Produkte)
          Produkt_5 (FKey= PKey aus Produkte)
          Produkt_6 (FKey= PKey aus Produkte)
          Produkt_7 (FKey= PKey aus Produkte)
          ...
          ...
          ...

          [Produkt]
          Produkt_ID (PKey)
          Produkt_Name
          Produkt_Einheit
          Produkt_Preis
          Produkt_Detail

          LG
          Sh0Xy
          Zuletzt editiert von Sh0Xy; 25.01.2020, 21:57.

          Comment


          • #7
            Also was man so als Zwischentabelle bezeichnet:
            Man baut keine Tabellen, in denen Spalte für Spalte eine Referenz auf den gleichen PK einer anderen Tabelle verwendet wird. Auch nicht Tabellen, in denen generell mehrere Spalten für die gleiche Information verwendet werden.

            Eine Zwischentabelle hätte folgende Spalten:
            Produkt_ID, LS_ID

            Werte wären dann z.B für einen Lieferschein Nr 42 und 3 Produkte:
            4711, 42
            4630, 42
            1, 42

            Man braucht auch für derartige Tabellen keine eigenständige PK Spalte. Die Kombination der PK der referenzierten Tabellen sollte automatisch einen eindeutigen Schlüssel bilden. Das kann man dann auch amtlich machen, indem der Primärschlüssel über (hier) die beiden FK definiert wird.
            Man kann bei Bedarf für einen bequemen und totsicheren Zugriff auch eine separate PK Spalte definieren, die z.B. über einen Autoincrementwert jede einzelne Lieferscheinposition direkt ansprechbar macht. Das kann "praktisch" in der programmatischen Handhabung sein, wenn viel Updates und Deletes darauf zielen, also irgendein eigenartiger Workflow. Lieferscheine haben aber einen solchen Workflow eher nicht.

            Und bitte noch mal überlegen:
            Produkt1, Produkt2, . . Produkt7 .... wo soll das enden? Oder so: Wer hat nur 7 Produkte im Angebot? Oder so: Möchte man einen Datenbankadministrator und einen Programmierer einschalten, wenn man Produkt Nr 8 erfunden hat?

            Wenn man eh schon Bauchschmerzen mit dem Datenmodell hat, nochmal an das Wesen von Tabellen denken.
            Eine tabellarische Notation auch jenseits von Datenbanken kennzeichnet sich nicht dadurch, dass ständig neue Spalten angelegt werden, sondern dadurch, dass man immer neue Zeilen anlegt.
            Auch ohne die ganze Normalisierungstheorie kann man sich das als Denkhilfe für die Modellierung hernehmen. Dynamik wird durch immer neue Zeilen oder aktualisierte oder gelöschte Zeilen abgebildet, nicht durch neue Spalten.

            Gruß, defo

            Comment


            • Sh0Xy
              Sh0Xy commented
              Editing a comment
              Sry, für die Verspätete Antwort - wie du es beschrieben hast meinte ich das ebenfalls. Mein Ziel war es ja hier ein System aufzusetzen damit ich keine Spalten in den Tables adden muss, sondern bequem Zeilen. Habe das ganze bis dato schon umgesetzt.
              Somit ist das erledigt. Vielen Dank für die Hilfe!
          Working...
          X