Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbanksuche, aber wie am sinnvollsten?

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

  • Datenbanksuche, aber wie am sinnvollsten?

    Hallo Leute,

    momentan bin ich am hin und her überlegen wie ich am besten mein Problem löse, mir fällt einfach nix sinnvolles ein oder stehe einfach auf dem Schlauch!

    Um es ganz einfach zu erklären habe ich ein Beispiel gemacht:

    Tabelle Werkzeuge:
    id name_werkzeug beschreibung teile
    1 meterstab ....... 2
    2 bohrer_set ........ 5
    Tabelle Teile:
    id name teile_id_werkzeug gesamt_teile menge
    1 holz 1 2 5
    2 schraube 1 2 2
    3 schachtel 2 3 1
    4 bohrer holz 2 3 2
    5 bohrer metall 2 3 2
    Tabelle "Teile im Lager"
    id name menge
    1 holz 8
    2 schraube 7

    Ich denke dieses simple Beispiel verdeutlicht gleich mein Problem, da ich hier einfach nicht weiter komm, ich arbeite in PHP/MySqli !

    Ich benötige hier einfach eine Suche die ermöglicht um mit den "Teilen im Lager" herauszufinden ob ich damit ein "Werkzeug" bauen kann, bzw. ob ich überhaupt ein "Werkzeug" bauen könnte!
    Oder wäre es hier sinnvoller die ganze Tabellenstruktur zu ändern?


  • #2
    Zitat von Hayman Beitrag anzeigen
    Oder wäre es hier sinnvoller die ganze Tabellenstruktur zu ändern?
    Vermutlich, da 3.NF nicht erreicht bzw. verletzt wird.

    Warum "Teile" mit einem Werkzeug in Verbindung stehen, ist mir nicht ganz klar... ebensowenig, was "teile" in Tabelle "Werkzeuge" bzw. "gesamt_teile" in Tabelle "Teile" bedeuten soll.


    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

      Kommentar


      • #4
        Zitat von lstegelitz Beitrag anzeigen

        Vermutlich, da 3.NF nicht erreicht bzw. verletzt wird.

        Warum "Teile" mit einem Werkzeug in Verbindung stehen, ist mir nicht ganz klar...
        Hat er aber erklärt.

        Hayman Was du da vorhast, ist eine sog. "Stücklistenauflösung" und gehört in das Fachgebiet der Produktionsplanung. Unter diesen beiden Stichworten kannst du dich ja mal ein bissle schlau machen.

        Konkret ist der Weg erstmal ok, aber richtig ist, daß du die Normalisierungsgrundsätze verletzt. Auch weiß ich nicht welche Spaltennamen genau bedeuten sollen, da geht es mir wie Istegelitz:
        ebensowenig, was "teile" in Tabelle "Werkzeuge" bzw. "gesamt_teile" in Tabelle "Teile" bedeuten soll.
        Normalerweise sieht das so aus, daß die betr. Tabelle "Oberteile" und "Unterteile" führt. Desweiteren wird angegeben, ob es sich um ein Teil handelt, das soz. "atomar" ist, also nicht mehr aus anderen aufgebaut ist, ob es eine Baugruppe ist oder ein Endprodukt. Da auch Baugruppen aus Baugruppen bestehen können, muß noch die Stufe der Baugruppen-Hierarchie benannt werden. Insgesamt muß bekannt sein, wieviele Stufen es maximal gibt.

        Daraus werden zwei Tabellen gemacht:
        Code:
        ZeilenID | OberteilID | UnterteilID | Menge | Stufe
        ---------+------------+-------------+-------+-------
             1   |         1  |          2  |    2  |   2
             2   |         1  |          5  |    1  |   2
             3   |         5  |          4  |    2  |   1
             4   |         5  |          6  |    4  |   1
             5   |         2  |          3  |    1  |   1
             6   |         2  |          7  |    1  |   1
        
        TeilID | Bezeichnung | TeilStadium
        -------+-------------+--------------
            1  | Box         | fertig
            2  | Deckel      | Baugruppe
            3  | Rahmen      | atomar
            4  | Schraube    | atomar
            5  | Gestell     | Baugruppe
            6  | Kante       | atomar
            7  | Platte      | atomar
        Das Ergebnis kann nun per Abfrage berechnet werden oder durch Dazwischenschalten einer speziellen Software. Mit Abfragen geht es so, daß mit n-1 Instanzen der 1. Tabelle gearbeitet wird, worin n die Zahl der Gesamtstufen ist. Die 1. Tabelle referenziert also immer auf sich selbst. Am Ende wird jeweils eine Instanz der 2. Tabelle angehängt.
        Die Abfrage lautet dann:
        Code:
        SELECT newteile.Bezeichnung AS OT2, newstrukt.Menge AS Menge2,
        newteile_1.Bezeichnung AS OT1, newstrukt_1.Menge AS Menge1,
        newteile_2.Bezeichnung AS UT, newstrukt_1.Stufe, [menge2]*[menge1] AS AnzahlUT
        FROM (((newstrukt INNER JOIN newstrukt AS newstrukt_1
        ON newstrukt.UnterteilID = newstrukt_1.OberteilID)
        INNER JOIN newteile ON newstrukt.OberteilID = newteile.TeilID)
        INNER JOIN newteile AS newteile_1
        ON newstrukt_1.OberteilID = newteile_1.TeilID)
        INNER JOIN newteile AS newteile_2 ON newstrukt_1.UnterteilID = newteile_2.TeilID
        WHERE (((newstrukt_1.Stufe)=1) AND ((newstrukt.Stufe)=2));

        Kommentar


        • #5
          Zitat von Hayman Beitrag anzeigen
          ..
          Um es ganz einfach zu erklären habe ich ein Beispiel gemacht:
          ..
          einfach eine Suche die ermöglicht um mit den "Teilen im Lager" herauszufinden ob ich damit ein "Werkzeug" bauen kann, bzw. ob ich überhaupt ein "Werkzeug" bauen könnte!
          Ist das ein anonymisiertes Beispiel oder willst Du wirklich das umsetzen, was im Beispiel aufgeführt ist?
          So oder so, als Beispiel etwas unglücklich, weil man Werkzeuge braucht, um Werkzeuge zu machen. Vielleicht kannst Du noch genauer schreiben, was Du vorhast (präzisieren) und Dich zunächst auf eine Sache beschränken, denn ein bestimmtes Werkzeug zu bauen und eine Aussage dazu zu treffen (Wie? Geht/Geht nicht! Fehlteile:..) ist eine ziemlich andere Aufgabe, als festzustellen, ob überhaupt irgendetwas baubar ist. Vermutlich wäre die Tabelle "Teile" eher eine Tabelle Plan oder Stückliste?

          Kommentar


          • #6
            Zitat von Perry Staltic Beitrag anzeigen
            Ist das ein anonymisiertes Beispiel oder willst Du wirklich das umsetzen, was im Beispiel aufgeführt ist?
            So oder so, als Beispiel etwas unglücklich, weil man Werkzeuge braucht, um Werkzeuge zu machen. Vielleicht kannst Du noch genauer schreiben, was Du vorhast (präzisieren) und Dich zunächst auf eine Sache beschränken, denn ein bestimmtes Werkzeug zu bauen und eine Aussage dazu zu treffen (Wie? Geht/Geht nicht! Fehlteile:..) ist eine ziemlich andere Aufgabe, als festzustellen, ob überhaupt irgendetwas baubar ist. Vermutlich wäre die Tabelle "Teile" eher eine Tabelle Plan oder Stückliste?
            Letzteres ist der Fall. So steht es nämlich in #1, wenn auch der Ausdruck "Stückliste" nicht auftaucht. Unglücklich formuliert ist das ganze trotzdem, Hayman
            Andererseits ist die hier versammelte "Elite" ja auch nicht ganz unerfahren ...

            Kommentar


            • #7
              Hier mal die beiden obigen Tabellen in einer Test-DB:
              Code:
              -- phpMyAdmin SQL Dump
              -- version 4.2.11
              -- http://www.phpmyadmin.net
              --
              -- Host: 127.0.0.1
              -- Erstellungszeit: 11. Feb 2019 um 23:31
              -- Server Version: 5.6.21
              -- PHP-Version: 5.6.3
              
              SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
              SET time_zone = "+00:00";
              
              
              /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
              /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
              /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
              /*!40101 SET NAMES utf8 */;
              
              --
              -- Datenbank: `hayman`
              --
              
              -- --------------------------------------------------------
              
              --
              -- Tabellenstruktur für Tabelle `newstrukt`
              --
              
              CREATE TABLE IF NOT EXISTS `newstrukt` (
              `ZeilenID` int(11) NOT NULL,
                `OberteilID` int(11) NOT NULL,
                `UnterteilID` int(11) NOT NULL,
                `Menge` int(11) NOT NULL,
                `Stufe` int(11) NOT NULL
              ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
              
              --
              -- Daten für Tabelle `newstrukt`
              --
              
              INSERT INTO `newstrukt` (`ZeilenID`, `OberteilID`, `UnterteilID`, `Menge`, `Stufe`) VALUES
              (1, 1, 2, 2, 2),
              (2, 1, 5, 1, 2),
              (3, 5, 4, 2, 1),
              (4, 5, 6, 4, 1),
              (5, 2, 3, 1, 1),
              (6, 2, 7, 1, 1);
              
              -- --------------------------------------------------------
              
              --
              -- Tabellenstruktur für Tabelle `newteile`
              --
              
              CREATE TABLE IF NOT EXISTS `newteile` (
              `TeilID` int(11) NOT NULL,
                `Bezeichnung` text NOT NULL,
                `TeilStadium` text NOT NULL
              ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
              
              --
              -- Daten für Tabelle `newteile`
              --
              
              INSERT INTO `newteile` (`TeilID`, `Bezeichnung`, `TeilStadium`) VALUES
              (1, 'Box', 'fertig'),
              (2, 'Deckel', 'Baugruppe'),
              (3, 'Rahmen', 'atomar'),
              (4, 'Schraube', 'atomar'),
              (5, 'Gestell', 'Baugruppe'),
              (6, 'Kante ', 'atomar'),
              (7, 'Platte', 'atomar');
              
              --
              -- Indizes der exportierten Tabellen
              --
              
              --
              -- Indizes für die Tabelle `newstrukt`
              --
              ALTER TABLE `newstrukt`
               ADD PRIMARY KEY (`ZeilenID`);
              
              --
              -- Indizes für die Tabelle `newteile`
              --
              ALTER TABLE `newteile`
               ADD PRIMARY KEY (`TeilID`);
              
              --
              -- AUTO_INCREMENT für exportierte Tabellen
              --
              
              --
              -- AUTO_INCREMENT für Tabelle `newstrukt`
              --
              ALTER TABLE `newstrukt`
              MODIFY `ZeilenID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=7;
              --
              -- AUTO_INCREMENT für Tabelle `newteile`
              --
              ALTER TABLE `newteile`
              MODIFY `TeilID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8;
              /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
              /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
              /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
              Die Abfrage
              Code:
              SELECT newteile.Bezeichnung AS OT2, newstrukt.Menge AS Menge2, 
                     newteile_1.Bezeichnung AS OT1, newstrukt_1.Menge AS Menge1, 
                     newteile_2.Bezeichnung AS UT, newstrukt_1.Stufe, 
                     newstrukt.Menge*newstrukt_1.Menge AS AnzahlUT
              FROM   (((newstrukt 
              INNER JOIN newstrukt AS newstrukt_1 
              ON     newstrukt.UnterteilID = newstrukt_1.OberteilID) 
              INNER JOIN newteile 
              ON     newstrukt.OberteilID = newteile.TeilID) 
              INNER JOIN newteile AS newteile_1 
              ON     newstrukt_1.OberteilID = newteile_1.TeilID) 
              INNER JOIN newteile AS newteile_2 
              ON     newstrukt_1.UnterteilID = newteile_2.TeilID
              WHERE  newstrukt_1.Stufe=1 AND newstrukt.Stufe=2;
              liefert alle Daten des Gozinthografen sowie die benötigten Teilemengen für die Teile auf der untersten Stufe.

              Kommentar


              • #8
                Alf2016
                Die Elite würde natürlich auch darauf achten, eine einheitliche Sprache für die Objekte zu verwenden.
                Aus den Anforderungen des TE geht nicht hervor, dass ein hierarchisches System benötigt wird.

                Kommentar


                • #9
                  offtopic:
                  weil ich das lied so gerne hab, und weil sich oben zwei elitäre getroffen haben:

                  https://www.youtube.com/watch?v=Slqr_RVJG6A

                  Kommentar


                  • #10
                    Alf2016

                    Du schreibst:

                    "Insgesamt muss bekannt sein, wieviele Stufen es maximal gibt."

                    Das erleichtert nur dir die Erstellung der Datenbankabfrage, in der Praxis würde ich das rekursiv lösen wollen und nicht begrenzen.

                    Die Begriffe "Oberteile" und "Unterteile" sehe ich eher in der Bekleidungsindustrie.

                    Deine Neigung Variablen zu nummerieren ist sehr stark ausgeprägt, das ist mir in anderen Threads bereits aufgefallen und finde ich nicht gut.

                    Es erscheint mir auch so, dass Du die Anforderung des TE aus den Augen verloren hast.

                    Er wollte wissen, ob er mit den lagernden Teilen ein Werkzeug bauen kann. Du lieferst ihm (hoffentlich, ich habe es nicht getestet) alle Gozinthografen.

                    Die Anforderung des TE ist etwas merkwürdig. Er möchte wissen, welche Werkzeuge er mit den lagernden Teilen bauen kann. Spätestens hier würde ich mir überlegen,warum die Teile noch im Lager liegen -> wahrscheinlich deswegen, weil sie keiner gebraucht o. bestellt hat....

                    Kommentar


                    • #11
                      Für den Fall, Hayman, daß du dein Vorhaben nicht inzwischen aufgegeben hast, würde ich Dir raten, jetzt erstmal Ordnung in die Sache zu bringen, z.B. über folgende Leitfragen:
                      1. Was ist Was? Will sagen: Welche Tabellen entsprechen deinen Tabellen, welche Spalten entsprechen welchen Spalten? Sind die Tabellen, die ich dir zeigte, überhaupt die "richtigen"?
                      2. Willst du tatsächlich ein mehrstufiges Verfahren? M.E. wirst du, wenn das ganze ein ernsthaftes Ansinnen ist, da nicht drum rumkommen - jeder Produziert heute mit Baugruppen, in denen sich die Einzelteile wiederholen.
                      3. Welches Verfahren wähle ich überhaupt?
                      Zum letzteren Punkt: Ich mache sowas nicht so gerne mit einer einzigen Abfrage (obwohl ich es so gezeigt habe). Auch hat die gezeigte Lösung noch jede Menge Beschränkungen, im Moment müssen nämlich alle Gozinthografen-"Äste" gleich lang sein.

                      Mir gefallen eher Lösungen, in denen die fertige Lösung Schritt für Schritt (aber nicht "Schrittchen für Schrittchen", dann kann man es gleich auf dem Papier mit Bleistift machen...) im Benutzerdialog erstellt wird. Dabei würden dann praktischerweise erstmal alle Daten auf den Client geladen und dort mit Javascript und Arrays verarbeitet.

                      Wie gesagt: Viele Wege führen nach Rom. Die Entscheidung liegt bei dir.

                      Kommentar


                      • #12
                        Der TE sollte auch mal mitteilen wozu diese Anwendung verwendet wird.
                        Denke aber das wird ebenso unbeantwortet bleiben wie beim letzten Mal.

                        Kommentar

                        Lädt...
                        X