Лучший способ хранить и искать ключевые слова для записи в PHP и MySQL? - PullRequest
7 голосов
/ 21 сентября 2010

Я не трогал ни один код в течение хороших 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 столбце, но это не похоже налучший способ поиска базы данных.

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

Ответы [ 3 ]

7 голосов
/ 21 сентября 2010

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

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]
6 голосов
/ 21 сентября 2010

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

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

Вам необходимо сохранить вторую таблицу с ключевыми словами и третью таблицу «многие ко многим», чтобы связать ключевые слова с соответствующими закладками. Это довольно стандартный дизайн для «тегирования» в реляционной базе данных.

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

Смотри также:

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

2 голосов
/ 21 сентября 2010

Самым простым и быстрым способом поиска является использование оператора 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', в поле 'name' или 'description', используя следующий запрос ...

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), затем выполните поиск по нему.

...