1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Lokale SPIEGEL-Datenbank (MySQL) - Effizienz?

Dieses Thema im Forum "PHP & Co." wurde erstellt von MasterofDistres, 19.07.09.

  1. MasterofDistres

    MasterofDistres Kleiner Weinapfel

    Dabei seit:
    07.12.06
    Beiträge:
    1.139
    Also vor ein paar Tagen ist mir mal die Idee gekommen, meine angesammelten SPIEGEL-Hefte (~3 Jahre) etwas zu sortieren und das Inhaltsverzeichnis in eine Datenbank einzupflegen, getrennt nach Heftnummer/Jahr.

    Hab inzwischen die letzten 2 Hefte in eine (MySQL-)Datenbank geschrieben (Datenbankaufbau siehe Bild (Original sind verlinkt)):

    [​IMG]
    [​IMG]

    Die Ausgabe sieht folgendermaßen aus:

    [​IMG]

    und läuft über eine jQuery-Ajax-As-you-type Abfrage der Datenbank, das Backend sieht wie folgt aus:

    Code:
            <?php header("Content-Type: text/html; charset=utf-8");
            // SQL-Connection-details - Config.php
            $dbhost = 'localhost';
            $dbuser = 'root';
            $dbname = 'spiegel';
            $dbpass = '';
    
            // Establish connection - opendb.php
    	$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
            mysql_select_db($dbname);
    	mysql_set_charset("utf8");
    	
    	$term = htmlspecialchars(substr($_POST['search_term'],0, 100));
    	$term = mysql_real_escape_string($term);
    	$term = strip_tags($term);
    	$term = addslashes($term);
    	
    	$query = "SHOW TABLES FROM spiegel";
    	$query2 = "";
    	$result = mysql_query($query) or die(mysql_error());
    	
    	if(mysql_num_rows($result) > 0) {
    		while($row = mysql_fetch_array($result)) {
    			$query2 .= "(SELECT * FROM `$row[0]` WHERE Ressort LIKE '%$term%' OR Thema LIKE '%$term%' OR Titel LIKE '%$term%')";
    			$query2 .= " UNION ";
    		}
    	}
    
    	$query2 = substr($query2, 0, -7);
    	
    	$string = "";
    	$result2 = mysql_query($query2) or die(mysql_error());
    	
    	if (mysql_num_rows($result2) > 0) {
    		while($row2 = mysql_fetch_object($result2)) {
    	 	    $string .= "<strong>".$row2->Ressort."</strong> - ";
    		    $string .= "<strong>".$row2->Thema.":</strong> ";
    	 	    $string .= $row2->Titel."</a>";
    	 	    $string .= " (<em>Seite <strong>".($row2->Seite).".</strong></em>)";
    	 	    $string .= "<br/>\n";
    	 	}
    	
    	} 
    	else {
    		  $string = "Keine Ergebnisse!";
    	} 
    
    	echo $string;
    ?>
    
    Das heißt bei ~150 Tabellen (á ~35 Einträgen) würde er eine Riesen-Query zusammenbasteln und bei jeden neuen eigegebenen Buchstaben erneuern (das jQuery-As-you-type), deshalb die Effizienzfrage: ist das wirklich sinnvoll? Hier muss man jedoch hinzusagen, dass das nicht auf einem öffentlich zugänglichen Webserver laufen soll, sondern nur auf dem bei Leopard integrierten, den ich bei Nichtbenutzung abschalte. Und was ich eigentlich noch einbauen wollte, jedoch nicht genau weiß wie, ist, dass bei jedem Eintrag bei der Ausgabe (siehe Bild) die Spiegel-Nr. + Jahreszahl mit ausgegeben werden soll - hätte da jemand eine Idee zu? Danke schonmal :)
     
  2. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Also ich würde zwei Tabellen erstellen.
    Heft(Heft_ID, Spiegel-Nr ,Erscheinungsdatum)
    Inhaltsverzeichnis(Eintrag_ID, Heft_ID, Titel, Thema, Ressort, Seite)

    Das Attribut im der Tabelle Inhaltsverzeichnis ist dann ein Fremdschlüssen mit einer m:1 Beziehung.
    Genau genommen müsste Ressort auch eine eigene Tabelle mit Beziehung zu Inhaltsverzeichnis haben.

    Hier ein Diagramm: db.jpg
     
    #2 Jamsven, 19.07.09
    Zuletzt bearbeitet: 19.07.09
  3. MasterofDistres

    MasterofDistres Kleiner Weinapfel

    Dabei seit:
    07.12.06
    Beiträge:
    1.139
    So, ich hab in der Zwischenzeit erstmal ein 2. Feld eingebaut, in dem man mithilfe eines Autocompletes die gewünschte Heftnummer eingeben kann. Das funktioniert eigentlich auch alles bis auf den Umstand, die Tabellennamen ja wie folgt aufgebaut sind „26-09“ und beim Einfügen (folgende Funktion)

    Code:
    function fill(value) {
    	$("#number").val(value);
    	$("#suggestions").fadeOut("normal");
    	e.preventDefault();
    	ajax_search();
    }
    zwar in das Textfeld geschrieben, aber blöderweise vorher ausgerechnet werden, sprich aus „26-09“ wird ein „17“! Hab' aber gerade auch irgendwie keine Idee, wie ich das unterbinden könnte.

    EDIT: Es sieht so aus, als würde das irgendwie in der Weitergabe falsch laufen, das Komische ist aber, dass die Anzeige in der Liste (das 2. row[0]) problemlos funktioniert.

    Code:
    while($row = mysql_fetch_array($result)) {
    	echo "<li onclick='fill($row[0]);'>$row[0]</li>";
    }
    
    Bzgl. der Datenbankerweiterung erstmal danke an Jamsven, ich wüsste zwar, wie ich in Java-Klassen Abhängigkeiten herstelle, aber wie das genau mit Tabellen funktionieren könnte, bleibt mir noch im Verborgenen, auch Google konnte mir da leider nicht helfen. Aber lässt sich nicht irgendwie der Tabellenname dort mit einbauen, denn immerhin enthält dieser die benötigten Informationen - ich weiß aber auch nicht, wie das in die Schleife passen könnte.
     
    #3 MasterofDistres, 19.07.09
    Zuletzt bearbeitet: 19.07.09
  4. naich

    naich Pommerscher Krummstiel

    Dabei seit:
    22.11.08
    Beiträge:
    3.059
    Also es ist schon wichtig, eine gut erstellte Datenbank im Hintergrund zu haben.
    Aber da du das scheinbar nur lokal auf deinem Rechner ausführen willst, und nicht im Internet, würde ich mir über die Effizienz jetzt noch nicht zu viele Gedanken machen...
    ... was jetzt nicht heißt, dass du den Code ineffizeint hinschreiben sollst. Wichtiger wäre mir erstmal, dass es überhaupt funktioniert.
     
  5. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Naja das kann auch nach hinten los gehen.
    Wenn man nämlich in jedem Datensatz die Spiegel Ausgabe stehen und man sich bei einem Heft mit dem Datum vertan hat, dann muss man jeden Datensatz ändern welcher semantisch relevant ist.
    So kommen auf Dauer Fehler.
    Ich kann die Page empfehlen, ist aber postgreSQL
    http://kaul.inf.h-bonn-rhein-sieg.de/home/script/db/2009/index.php
    Zu mySQL gibt es aber auch massenhaft Literatur.
    Allgemein über das richtige Datenbankdesign:
    http://www.pearson-studium.de/main/main.asp?page=bookdetails&ProductID=83032

    Es gibt aber noch einen graphischen Datenbankdesigner, welcher den richtigen mySQL Code am Ende ausspuckt: http://www.mysql.de/products/workbench/
    Dieser ist auch in der Lage "relations" durch zwei Klicks zu erstellen.
     

Diese Seite empfehlen