簡體   English   中英

在PHP和MySQL中存儲和搜索關鍵字以獲取記錄的最佳方法?

[英]Best way to store and search keywords for a record in PHP and MySQL?

我沒有在4-5個月內接觸到任何代碼,所以今天回到它,通常需要一個星期左右的時間才能讓我的大腦中的所有信息再次流過我的大腦。 所以我即將開始的項目將是一個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列中,但這似乎不是搜索數據庫時最好的方法。

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

最好的方法是創建一個單獨的表來包含您的關鍵字,然后添加一個交集 (或連接 )表來連接帶有書簽的關鍵字。

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

當您插入書簽時,您還會插入正在使用但尚未在keywords表中的任何keywords ,以及bookmark_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]

你是對的,將逗號分隔列表存儲在一列中並不是一個好方法(這稱為重復組 ,它違反了關系數據庫設計的第一范式 )。

使用LIKE謂詞不是一個好的選擇,因為它無法從索引中受益。 以這種方式搜索關鍵字比以正常形式設計正確的數據庫並添加索引要慢幾百或幾千倍。

您需要存儲列出關鍵字的第二個表,以及第三個多對多表,以便將關鍵字與適用的書簽配對。 這是在關系數據庫中“標記”的非常標准的設計。

在像CouchDB或MongoDB這樣的非關系數據庫中,您可以將一個字段設為一組關鍵字,並對其進行索引,以便查詢可以高效。 但不是在關系數據庫中。

也可以看看:

在查看這些問題時,請查看右側欄中的許多相關問題。

要實現的最簡單,最快速的搜索技術是使用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),然后搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM