• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Lokale SPIEGEL-Datenbank (MySQL) - Effizienz?

MasterofDistres

Kleiner Weinapfel
Registriert
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)):




Die Ausgabe sieht folgendermaßen aus:



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 :)
 

Jamsven

London Pepping
Registriert
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
 
Zuletzt bearbeitet:

MasterofDistres

Kleiner Weinapfel
Registriert
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.
 
Zuletzt bearbeitet:

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
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.
 

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
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.

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.