2010-09-21 7 views
6

Ich habe seit gut 4-5 Monaten keinen Code mehr berührt, also brauche ich nur noch eine Woche oder so, um alle Informationen wieder durch mein Gehirn fließen zu lassen, wenn ich Monate damit verbringe. Mein Projekt, das ich jetzt starten werde, ist eine PHP/MySQL Backend-Lesezeichen-Datenbank.Die beste Möglichkeit zum Speichern und Suchen von Stichwörtern für einen Datensatz in PHP und MySQL?

Ich möchte eine gute durchsuchbare Datenbank mit all meinen Lieblingswebsites/Lesezeichen erstellen. Jedem Datensatz werden mehrere Schlüsselwörter zugewiesen, so dass ich problemlos alle meine Lesezeichen nach dem Begriff "php" durchsuchen kann und alle Datensätze mit "php" in der Schlüsselwortspalte oder dem Titel oder sonstwie in einer Ergebnismenge zurückkommen.

Hier ist meine Idee für die Datenbank so weit ...

auto_id = /*Auto incremented ID number for database*/ 
name/title = /*Name/title of the Website*/ 
description = /*brief description of the site*/ 
URL = /*URL to open when I click a link*/ 
clicks = /*increments by 1 everytime I click the link*/ 
date_created = /*datetime that URL bookmark was added*/ 
date_accessed = /*datetime field for when last clicked on*/ 
category = /*category name or number to create a folder like structure of bookmarks in groups*/ 
sub_category = /*some categories will have subcategories (ie programming->c## programming->PHP)*/ 
keywords = /*Keywords used for searching*/ 

Das ist für mich ziemlich geradlinig ist, wie dieses System alle zu bauen, außer ich auf dem besten Weg, um Hilfe/Beratung Suche nach Speichere die Schlüsselwörter. Jede Website/Datensatz, den ich der Datenbank hinzufüge, kann 1 bis zu mehreren Keywords pro Website haben. Diese Keywords müssen beim Suchen in meiner App hilfreich sein. Wie soll ich Keywords für eine Site in meiner Datenbank speichern? Ich weiß, ich könnte einfach eine "Keywords" Zeile in der Tabelle und speichern Sie die Schlüsselwörter für jeden Datensatz wie diese "PHP, Web, etc, Keyword4", so dass alle Keywords für jede Website in 1 Spalte gespeichert werden, aber das scheint nicht zu sein die beste Methode, wenn es um die Suche in der Datenbank geht.

Bitte sagen Sie mir, wie Sie diesen Teil tun würden? Danke für jede Hilfe

+0

möglich Duplikat [System für Spur zu halten von Benutzerfavoriten] (http://stackoverflow.com/questions/3722242/system-for-keeping-track-of-user-favorites) –

+1

@Daniel Vandersluis: Ich würde nicht so sagen, vielleicht für beide Fragen die DB-Struktur der Lösung ist ähnlich/identisch, aber diese Frage ist eine spezifische zu lösen c Problem. Ich meine, ich suchte excatly dafür auf Google und nicht "wie man Favoriten behält" –

Antwort

7

Der beste Weg, dies zu tun, ist eine separate Tabelle erstellen, um Ihre Keywords enthalten und fügen Sie dann eine Kreuzung (oder beitreten) Tabelle Keywords mit Lesezeichen zu verbinden.

CREATE TABLE bookmarks (
    id INT NOT NULL, 
    ... etc. 
) 

CREATE TABLE keywords (
    id INT NOT NULL, 
    ... etc. 
) 

CREATE TABLE bookmark_keywords (
    bookmark_id INT NOT NULL, 
    keyword_id INT NOT NULL, 
    PRIMARY KEY (bookmark_id, keyword_id), 
    FOREIGN KEY bookmark_id REFERENCES bookmarks (id), 
    FOREIGN KEY keyword_id REFERENCES keywords (id) 
) 

Wenn Sie ein Lesezeichen einfügen, Sie würden auch alle Keywords einfügen, die verwendet werden und sind nicht bereits in der keywords Tabelle sowie eine Zeile in bookmark_keywords um das Stichwort mit dem Lesezeichen beitreten .

Dann, wenn Sie abfragen möchten, was ein Lesezeichen Schlüsselwörter hat:

SELECT k.* 
FROM keywords AS k 
LEFT JOIN bookmark_keywords AS kb 
    ON kb.keyword_id = k.id 
WHERE kb.bookmark_id = [ID of the bookmark] 

Und für die Abfrage, welche Lesezeichen teilen ein bestimmtes Stichwort:

SELECT b.* 
FROM bookmarks AS b 
LEFT JOIN bookmark_keywords AS kb 
    ON kb.bookmark_id = b.id 
WHERE kb.keyword_id = [ID of the keyword] 
+0

+1 einfache intelligente und klare Hinweis, wie es geht! Danke Daniel und noch einen Akklam für SO. –

2

Die einfachste und schnellste Suchtechnik zu implementieren ist die Verwendung von MySQL LIKE-Anweisung. Mit LIKE können Sie in einer Spalte nach einer bestimmten Zeichenfolge suchen. Betrachten Sie das folgende Beispiel ...

auto_id name   description 
1   Cool PHP Site you know you love it 
2   PLARP! its Ruby gems gems gems! 
3   SqlWha   sql for the masses 
4   FuzzD00dle  fun in the sun, with some fuzz 

Sie konnten alle Zeilen finden, die die Zeichenfolge ‚php‘ enthalten entweder in der ‚Name‘ oder ‚Beschreibung‘ Feld die folgende Abfrage mit ...

SELECT * FROM bookmarks WHERE name LIKE '%php%' OR description LIKE '%php%'; 
  • '%' ist ein Platzhalterzeichen.

Referenz auf MySQL LIKE: http://www.tutorialspoint.com/mysql/mysql-like-clause.htm

Sie könnten auch eine 'Keywords' Spalte hinzufügen und speichern Sie die Keywords in einem kommagetrennten Format (dh: plarp1, plarp2, plarp3), dann durch die Suche.

+0

+1 interestring auch! –

6

Du hast Recht, eine durch Kommata getrennte Liste in einer Spalte zu speichern ist nicht ein guter Weg, es zu tun (das ist eine Wiederholungsgruppe genannt, und es verstößt gegen die First Normal Form von relationalen Datenbank-Design).

Mit einem LIKE Prädikat ist nicht eine gute Wahl, weil es nicht von einem Index profitieren kann. Auf diese Weise ist die Suche nach Schlüsselwörtern hundert- oder tausendfach langsamer als das Entwerfen einer richtigen Datenbank in normaler Form und das Hinzufügen von Indizes.

Sie müssen eine zweite Tabelle mit Schlagwörtern und eine dritte Viele-zu-Viele-Tabelle speichern, um die Schlüsselwörter mit den entsprechenden Lesezeichen zu verknüpfen. Dies ist ein hübscher Standardentwurf zum "Taggen" in einer relationalen Datenbank.

In nicht-relationalen Datenbanken wie CouchDB oder MongoDB können Sie ein Feld zu einer Gruppe von Schlüsselwörtern machen und sie indizieren, damit Abfragen effizient sein können. Aber nicht in einer relationalen Datenbank.auch

Siehe:

Auch wenn diese Fragen sehen, auf der rechten Seite die vielen damit verbundenen Fragen in der Spalte überprüfen.

Verwandte Themen