当前位置:  开发笔记 > 编程语言 > 正文

在PHP和MySQL中存储和搜索关键字以获取记录的最佳方法?

如何解决《在PHP和MySQL中存储和搜索关键字以获取记录的最佳方法?》经验,为你挑选了2个好方法。

我没有在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列中,但这似乎不是搜索数据库时最好的方法.

请告诉我你将如何做这部分?谢谢你的帮助



1> Daniel Vande..:

最好的方法是创建一个单独的表来包含您的关键字,然后添加一个交集(或连接)表来连接带有书签的关键字.

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表格中的任何关键字,以及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]



2> Bill Karwin..:

你是对的,将逗号分隔列表存储在一列中并不是一个好方法(这称为重复组,它违反了关系数据库设计的第一范式).

使用LIKE谓词不是一个好的选择,因为它无法从索引中受益.以这种方式搜索关键字比以正常形式设计正确的数据库并添加索引要慢几百或几千倍.

您需要存储列出关键字的第二个表,以及第三个多对多表,以便将关键字与适用的书签配对.这是在关系数据库中"标记"的非常标准的设计.

在像CouchDB或MongoDB这样的非关系数据库中,您可以将一个字段设为一组关键字,并对其进行索引,以便查询可以高效.但不是在关系数据库中.

也可以看看:

您如何建议实施标签或标签

标记数据库设计

在查看这些问题时,请查看右侧栏中的许多相关问题.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有