代码之家  ›  专栏  ›  技术社区  ›  JasonDavis

在PHP和MySQL中存储和搜索关键字的最佳方法?

  •  7
  • JasonDavis  · 技术社区  · 14 年前

    我已经有4-5个月没有接触过任何代码了,所以只要今天重新开始,通常需要一周左右的时间才能让所有的信息再次在我的大脑中流动,一旦我像那样休息了几个月。所以我的项目,我即将开始将是一个PHP/MySQL后端书签数据库。

    这是我到目前为止对数据库的想法。。。

    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到多个关键字。这些关键字需要能够帮助我的应用程序搜索部分。那么,我应该如何在数据库中存储网站的关键字呢?我知道我可以在表中有一个“keywords”行,并存储每个记录的关键字,比如“php,web,etc,keyword4”,这样每个站点的所有关键字都保存在一列中,但这似乎不是搜索数据库的最佳方法。

    请告诉我你会怎么做这个部分?谢谢你的帮助

    3 回复  |  直到 14 年前
        1
  •  7
  •   Daniel Vandersluis    14 年前

    最好的方法是创建一个单独的表来包含关键字,然后添加一个 交叉 参加

    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
  •  6
  •   Community CDub    8 年前

    你说得对,在一列中存储逗号分隔的列表不是一个好方法(这称为 它违反了法律 First Normal Form 关系数据库设计)。

    使用LIKE谓词是

    您需要存储第二个列出关键字的表,以及第三个多对多表,以便将关键字与适用的书签配对。对于关系数据库中的“标记”,这是一个相当标准的设计。

    另请参见:

    另外,在查看这些问题时,请检查右侧列中的许多相关问题。

        3
  •  2
  •   John Himmelman    14 年前

    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  
    

    您可以使用以下查询在“name”或“description”字段中找到包含字符串“php”的所有行。。。

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

    MySQL上的参考: http://www.tutorialspoint.com/mysql/mysql-like-clause.htm

    您还可以添加一个“keywords”列,并以逗号分隔的格式存储关键字(即:plarp1、plarp2、plarp3),然后在其中进行搜索。