2010-09-21 148 views
6

我在4-5個月的時間裏沒有觸及過任何代碼,所以今天剛剛回到它,通常需要一個星期左右的時間才能讓我的大腦再次獲得所有的信息,一旦我這樣做了幾個月。所以我即將開始的項目將是一個PHP/MySQL後端書籤數據庫。在PHP和MySQL中存儲和搜索記錄關鍵字的最佳方法?

我想用我最喜歡的網站/書籤創建一個漂亮的可搜索數據庫。每個記錄都有多個關鍵字分配給它,所以我可以很容易地搜索我所有的書籤中的術語「php」和所有帶有「php」的記錄在關鍵字列或標題中,否則將返回到結果集中。

這裏是我的數據庫到目前爲止的想法...

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*/ 

這是非常簡單的,我就如何建立這個系統的所有除了我正在尋找的最佳方式,以幫助/諮詢存儲關鍵字。每個網站/記錄添加到數據庫可以有1到多個關鍵字每個網站。這些關鍵字需要能夠幫助我的應用程序的搜索部分。那麼我應該如何在我的數據庫中存儲網站的關鍵字?我知道我可以在表格中添加一個「關鍵字」行,並將每個記錄的關鍵字存儲爲「php,web等,keyword4」,這樣每個網站的所有關鍵字都保存在1列中,但這似乎不是在搜索數據庫時最好的方法。

請告訴我你將如何做這部分?感謝您的幫助

+0

可能重複用戶收藏夾](http://stackoverflow.com/questions/3722242/system-for-keeping-track-of-user-favorites) – 2010-09-21 18:58:01

+1

@Daniel Vandersluis:我不會這麼說,也許對於這兩個問題的DB結構的解決方案是相似/有意義的,但這個問題是要求解決一個具體問題c問題。我的意思是,我在Google上爲此感到興奮,而不是「如何跟蹤收藏夾」 – 2011-02-22 11:41:10

回答

7

要做到這一點,最好的方法是創建一個單獨的表來包含你的關鍵字,然後添加一個路口(或加入)表中加入關鍵字的書籤。

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

當您插入書籤,你想也插入bookmark_keywords正在使用的和尚未在keywords表中的關鍵字,以及一排,以加入關鍵字與書籤。

然後,當你想查詢什麼關鍵詞書籤有:

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] 

以及查詢什麼書籤分享特定的關鍵字:

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簡單聰明,清晰提示如何做到這一點!感謝丹尼爾和另一個贊成SO。 – 2011-02-22 11:31:57

2

要實現的最簡單和最快的搜索技術是使用MySQL的LIKE語句。 LIKE可讓您搜索特定字符串的列。請看下面的例子...

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 

你可以找到包含字符串「PHP」的所有行無論是在「名稱」或使用下面的查詢「說明」字段...

SELECT * FROM bookmarks WHERE name LIKE '%php%' OR description LIKE '%php%'; 
  • '%'是通配符。

參考MySQL的LIKE:http://www.tutorialspoint.com/mysql/mysql-like-clause.htm

你也可以添加一個 '關鍵字' 列,並保存在一個逗號分隔格式的關鍵字(即:plarp1,plarp2,plarp3),然後通過搜索。

+0

+1 interestring呢! – 2011-02-22 11:52:50

6

你說的沒錯,在一列中存儲一個逗號分隔的列表是不要做的好方法(這被稱爲重複組和它違反了關係數據庫設計的First Normal Form)。

使用LIKE謂詞是而不是是一個不錯的選擇,因爲它不能從索引中受益。以這種方式搜索關鍵字比以正常形式設計適當的數據庫並添加索引慢數百或數千倍。

您需要存儲第二張列出關鍵字的表格,以及第三個多對多表格以將關鍵字與適用書籤配對。這是一個非常標準的設計,用於在關係數據庫中「標記」。

在非關係數據庫(如CouchDB或MongoDB)中,您可以將一個字段設置爲一組關鍵字,並將它們編入索引,以便查詢效率更高。但不在關係數據庫中。

參見:

還觀察這些問題時,檢查許多相關問題,在右邊的列。

相關問題