Beste Struktur?

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

  • Beste Struktur?

    Hallo zusammen,

    ich möchte beliebig viele Schlagwörter beliebig vielen Informationen zuweisen können.

    Dazu habe ich jetzt zwei DB-Strukturen. Welche ist eurer Meinung nach die performantere, wenn 30.000 Informationsdatensätze und 2000 Schlagwörter sind.

    Möglichkeit 1:

    ID_Schlagwort, Schlagwort => ID_Schlagwort, ID_Information => ID_Information, Information

    Da ja die Schlagwörter durchsucht werden müssen, stehen die in einer eigenen Tabelle, wobei Schlagwort als Index behandelt wird. So müssen besonders wenige Datensätze durchsucht werden (2000).

    Es müssen allerdings zwei Joins in das Query.

    Möglichkeit 2:

    Schlagwort, ID_Information => ID_Information, Information

    Hier werden in der ersten Tabelle die Schlagwörter mehrfach gespeichert und jeweils einer Information zugewiesen.
    Es müssen wesentlich mehr Datensätze durchsucht werden, es gibt aber nur ein Join.

    Was ist hier der bessere Ansatz?

    VIELEN DANK!

    Viele Grüsse
    strauberry

  • #2
    "Meinten Sie..."

    Hallo,

    schieb gleich noch ein Post hinterher

    Bei vielen Suchmaschinen gibt es mittlerweile ein "Meinten Sie..." wenn etwas falsch geschrieben wurde.

    Wie kann man sowas realisieren?

    DANKE!

    strauberry

    Kommentar


    • #3
      1. Ist das ein BS, zweitens werde ich aus deiner Art, DB-Struckturen darzustellen nicht schlau.

      Versuchs entweder mit nem einfachen(!) Dump oder in Tabellenversion.

      *verschieb*

      Kommentar


      • #4
        Über heuristische Suche. Ein Match ist dabei alles, was mehr als x% Übereinstimmung aufweist. Gibt es einen Match, der signifikant besser bewertet wurde, als der eigentliche Suchbegriff, bietet man ihn als "Meinten Sie ..." an.

        Geht natürlich auch anders. Etwa indem man die Suchwörter einer Rechtschreibprüfung unterzieht.

        Kommentar


        • #5
          Hi,

          das Forum hier kannte ich nicht, sorry.

          Möglichkeit 1:

          PHP-Code:

          CREATE TABLE 
          `schlagwoerter` (
            `
          ID_Schlagwoerterint(11NOT NULL auto_increment,
            `
          Schlagwortvarchar(255NOT NULL default '',
            
          PRIMARY KEY  (`ID_Schlagwoerter`),
            
          KEY `Schlagwort` (`Schlagwort`)
          ENGINE=MyISAM;


          CREATE TABLE `ntoninformationen` (
            `
          ID_NToNInformationenint(11NOT NULL auto_increment,
            `
          ID_Schlagwoerterint(11NOT NULL default '0',
            `
          ID_Informationenint(11NOT NULL default '0',
            `
          Haeufigkeitint(11NOT NULL default '0',
            
          PRIMARY KEY  (`ID_NToNInformationen`),
            
          KEY `ID_Schlagworter` (`ID_Schlagwoerter`,`ID_Informationen`)
          ENGINE=MyISAM;

          CREATE TABLE `informationen` (
            `
          ID_Informationenint(11NOT NULL auto_increment,
            `
          Titelvarchar(255NOT NULL default '',
            
          PRIMARY KEY  (`ID_Informationen`)
          ENGINE=MyISAM
          Man gibt ein Schlagwort ein und es wird in der Tabelle schlagwoerter gesucht. Dort wird die ID des Schlagwortes gefunden und über die N-To-N-Tabelle ntoninformationen die Informationen rausgesucht, die diesem Schlagwort zugeordnet sind.
          Anschließend werden die Informationen mit den entsprechenden IDs ausgelesen.
          Alles in einem Query.


          Möglichkeit 2:

          PHP-Code:

          CREATE TABLE 
          `schlagworte` (
            `
          ID_Schlagworteint(11NOT NULL auto_increment,
            `
          Schlagwortvarchar(255NOT NULL default '',
            `
          ID_Informationenint(11NOT NULL default '0',
            
          PRIMARY KEY  (`ID_Schlagworte`),
            
          KEY `Schlagwort` (`Schlagwort`)
          ENGINE=MyISAM;

          CREATE TABLE `informationen` (
            `
          ID_Informationenint(11NOT NULL auto_increment,
            `
          Titelvarchar(255NOT NULL default '',
            
          PRIMARY KEY  (`ID_Informationen`)
          ENGINE=MyISAM
          Hier wird die Tabelle schlagworte durchsucht. Es gibt eine Tabelle (also auch ein Join) weniger, dafür müssen in der Tabelle schlagworte mehr Datensätze durchsucht werden, weil die Schlagwörter ja für jeden Informationsdatensatz gespeichert werden müssen.

          Was ist die performantere Lösung?

          VIELEN DANK!
          strauberry

          Kommentar


          • #6
            Performantere Lösung? Nun das hängt u.a. von den Inhalten ab. Teste doch einfach beide.

            Kommentar


            • #7
              Das Problem ist, dass ich es nicht wirklich testen kann, weil ich noch nicht so viele Datensätze habe.

              Ein System zu testen, das mal 30.000 Datensätze haben soll, mit 5 zu testen ist nicht so wirklich aussagekräftig

              Was genau meinst Du mit "Es kommt auf die Inhalte an"?

              Kommentar


              • #8
                Ist meine Erklärung so schlecht ?

                Kommentar


                • #9
                  Bist du nach 5 Stunden schon am drängeln? Was ist den heute los? Ist doch Sonntag...

                  Kommentar


                  • #10
                    Genauer gesagt, kommt es nicht nur auf die Daten an, sondern auch auf das DBMS und die Hardware.
                    Aber ich sehe eigentlich keinen Anlaß, hier richtig weit auszuholen. Deine Ansätze sind nämlich beide nicht das Gelbe vom Ei.

                    Speichere die Informationen in einer Tabelle und schreibe dir ordentliche Queries oder Suchalgorithmen dazu.

                    Kommentar


                    • #11
                      Hi onemorenerd,

                      ok, damit du hier nicht alles hinschreiben musst (wobei hier von müssen ja sowieso nicht die Rede sein kann ): Wo kann ich da denn Hintergrundwissen zu finden?

                      DANKE!

                      Viele Grüsse
                      strauberry

                      Kommentar


                      • #12
                        Hi,

                        hab das jetzt mal so gemacht, dass ich eine Spalte "Schlagworte" direkt in die Informations-Tabelle eingebaut habe und darauf einen FULLTEXT-Index gesetzt. Auslesen mit MATCH().

                        Gefällt mir jetzt auf jeden Fall schon besser

                        Kommentar


                        • #13
                          @onemorered

                          vielleicht etwas OT aber trotzdem:
                          Manchmal sind Strukturen und Methoden die man vielleicht von vornherein als schlecht oder gar verrückt bezeichnen würde die performanteren. So eine Aussage ist natürlich nicht generell gültig, aber in nem konkreten Fall hat sich bei mir ein 'System' das Daten einfach in einem Textfeld speichert und ich mit etwas Hilfestellung von PHP und den String-funkionen von MySql die gewünschten Daten 'rauspicke' als deutlich schneller erwiesen als ein 'vernünftiger' relationaler Ansatz den einem eigentlich zu allererst in den Sinn kommt wenn man die Aufgabenstellung sieht.

                          Gruss
                          Quetschi
                          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                          Schön - etwas Geschichte kann ja nicht schaden.
                          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                          Kommentar


                          • #14
                            @Quetschi: ACK.
                            Aber unser Kandidat will etwa 30.000 Datensätze speichern und das sind sicher keine kompletten Buchtexte. Also Größenordnungen, die MySQL prima bewältigen kann. Da muß man sich nicht Google² einfallen lassen. Fulltext-Index + Match ist doch prima.

                            Kommentar


                            • #15
                              ACK? Das Kürzel kenn ich leider grad ned. Heißt was?

                              Jo, sorry, ich hab das überhaupt nicht auf die Aufgabenstellung des Threadstartes bezogen, deshalb schrieb ich ja '...vielleicht etwas OT...'
                              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                              Schön - etwas Geschichte kann ja nicht schaden.
                              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                              Kommentar

                              Lädt...
                              X