Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > [БД] поиск внутри строки


Автор: patap 11.5.2011, 15:02
В общем будет на сайт добавляться категории. Также будет поиск по этим категориям.
Пока еще ничего не делал. На начальной стадии разработки решил позаботиться о дальнейшей производительности и гибкости поиска.

Вот что надумал:

будет две таблицы
Код

[groups] (будет хранить полное название категории, и всякие опции к ней)
id
name


Код

[separate] (эту таблицу сделал для того, чтобы можно было использовать индексы при поиске внутри строки)
id
group_id
content


Алгоритм работы:
при добавлении новой категрии - заносим ее сначала в таблицу groups
затем разбиваем и заносим в таблицу separate, по такому принцыпу:

(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),

запрос для поиска
Код

SELECT * FROM groups
JOIN separate ON separate.group_id = groups.id
WHERE separate.content LIKE 'вася%'




как думаете - нормальный вариант? или можно как-то по другому. В общем рад любой критике и советам



Код

-- phpMyAdmin SQL Dump
-- version 3.3.2deb1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Май 11 2011 г., 14:45
-- Версия сервера: 5.1.41
-- Версия PHP: 5.3.2-1ubuntu4.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `humor`
--

-- --------------------------------------------------------

--
-- Структура таблицы `groups`
--

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `groups`
--

INSERT INTO `groups` (`id`, `name`) VALUES
(1, 'привет как твои дела'),
(2, 'особый привет, вася'),
(3, 'вася был особо опасен');

-- --------------------------------------------------------

--
-- Структура таблицы `separate`
--

CREATE TABLE IF NOT EXISTS `separate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_id` int(11) NOT NULL,
  `content` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

--
-- Дамп данных таблицы `separate`
--

INSERT INTO `separate` (`id`, `group_id`, `content`) VALUES
(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),
(5, 2, 'особый привет вася'),
(6, 2, 'привет вася'),
(7, 2, 'вася'),
(8, 3, 'вася был особо опасен'),
(9, 3, 'был особо опасен'),
(10, 3, 'особо опасен'),
(11, 3, 'опасен');

Автор: ksnk 11.5.2011, 15:46
а fulltext index не тем-же самым занимается? Вроде он именно по словам может быстро искать?
К тому-же непонятно, с чего хранить имено фразы, а не слова. Так бы и полный индекс можно было иметь, без like'а  smile 

Автор: patap 12.5.2011, 09:33
ksnk, блин, когда-то помню слыхал про fulltext, но я так и не нашел времени разобраться, так оно и забылось.
Действительно - это то что нужно, и мудрить ничего не надо.

достойный совет!  smile 

Цитата(ksnk @  11.5.2011,  14:46 Найти цитируемый пост)
К тому-же непонятно, с чего хранить имено фразы, а не слова.

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

WHERE separate.content LIKE 'твои дела%'

(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),

Автор: srt 9.6.2011, 12:48
мысль про разделение правильная, просто не везде применимая
в твоём случае нужно просто писать = а не LIKE
и всё будет очень шустро работать
имхо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)