繁体   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