Лучший способ хранения и поиска ключевых слов для записи в 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), а затем выполнить поиск.