Лучший способ хранения и поиска ключевых слов для записи в PHP и 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 до нескольких ключевых слов на сайт. Эти ключевые слова должны быть в состоянии помочь с поиском часть моего приложения. Итак, как я должен хранить ключевые слова для сайта в своей базе данных? Я знаю, что могу просто иметь строку "keywords" в таблице и хранить ключевые слова для каждой записи, например "php, web и т. д., keyword4", поэтому все ключевые слова для каждого сайта сохраняются в 1 столбце, но это не кажется лучшим методом, когда дело доходит до поиска в базе данных.

пожалуйста, скажите мне, как бы вы сделали эту часть? Спасибо за любую помощь

3 ответов


лучший способ сделать это-создать отдельную таблицу, содержащую ваши ключевые слова, а затем добавить пересечение (или вступить) таблица для объединения ключевых слов с закладками.

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 для того, чтобы присоединиться к сайта с закладок.

затем, когда вы хотите запросить, какие ключевые слова a закладки:

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]

вы правы, хранение списка, разделенного запятыми, в одном столбце не является хорошим способом сделать это (это называется повторяющаяся группа и это нарушает Первая Нормальная Форма проектирования реляционных баз данных).

использование подобного предиката -не хороший выбор, потому что он не может воспользоваться индексом. Поиск ключевых слов таким образом в сотни или тысячи раз медленнее, чем создание правильной базы данных в нормальной форме, и добавление индексы.

вам нужно сохранить вторую таблицу с перечислением ключевых слов и третью таблицу "многие ко многим" для сопряжения ключевых слов с применимыми закладками. Это довольно стандартный дизайн для "пометки" в реляционной базе данных.

в нереляционных базах данных, таких как CouchDB или MongoDB, вы можете сделать одно поле набором ключевых слов и индексировать их, чтобы запросы были эффективными. Но не в реляционной базе данных.

Читайте также:

также при просмотре этих вопросов, проверяем многие вопросы в столбце справа.


самый простой и быстрый метод поиска для реализации-это использование оператора LIKE MySQL. 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, как: http://www.tutorialspoint.com/mysql/mysql-like-clause.htm

вы также можете добавить столбец "ключевые слова" и сохранить ключевые слова в формате с разделителями-запятыми (т. е.: plarp1, plarp2, plarp3), а затем выполнить поиск.