Диалог с компьютером

  • Содержание

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

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

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

Структура базы данных

Для создания системы нам понадобятся следующие таблицы базы данных:

CREATE TABLE `quests` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`text` varchar(255) NOT NULL,
	`type` int(2) unsigned NOT NULL default '0',
	`rules` varchar(50) NOT NULL,
	`param` varchar(100) NOT NULL,
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;

Это таблица с вопросами.

  • text представляет собой сам вопрос.
  • type - тип вопроса. Он определяет, в каком виде будут представляться ответы пользователю. Это может быть текстовое поле, выпадающий список, несколько радио-кнопок или любой другой элемент управления.
  • rules - правила, которым должен удовлетворять ответ. К примеру ответ должен быть обязательным, представлять собой число, иметь определенную длину, ну и так далее.
  • param - внутренний параметр, об этом мы поговорим дальше.

Таблица с ответами:

CREATE TABLE `answers` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`qid` int(11) unsigned NOT NULL default '0',
	`text` varchar(255) NOT NULL,
	`value` varchar(100) NOT NULL,
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
  • qid - идентификатор соответствующего вопроса.
  • text - текст вопроса.
  • value - значение параметра.

Таким образом, после ответа на вопрос мы получаем связку параметр-значение param - value, которая содержит условие. В зависимости от него система определит, какие еще вопросы нужно задать пользователю. Эти правила содержатся в следующей таблице.

CREATE TABLE `rules` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`param` varchar(100) NOT NULL,
	`value` varchar(100) NOT NULL,
	`qid` int(11) unsigned NOT NULL default '0',
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;

Немножко расширим системы, позволив ей получать новые связки вопросов из исходных:

CREATE TABLE `combine_rules` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`param1` varchar(100) NOT NULL,
	`value1` varchar(100) NOT NULL,
	`operator` int(1) unsigned NOT NULL default '0',
	`param2` varchar(100) NOT NULL,
	`value2` varchar(100) NOT NULL,
	`param` varchar(100) NOT NULL,
	`value` varchar(100) NOT NULL,
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
  • operator определяет логическое И, ИЛИ или отсутствие оператора.

Таблица output хранит условия выборки в зависимости от значений параметров.

CREATE TABLE `output` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`param` varchar(100) NOT NULL,
	`value` varchar(100) NOT NULL,
	`output` varchar(100) NOT NULL,
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;

Алгоритм

Такова структура базы данных. Теперь пару слов об алгоритме.

При запуске системы создаем два массива A и B.
Массив A содержит идентификаторы вопросов, которые необходимо задать. Начальные условия можно инициализировать по условию, к примеру start -> 1.
Массив B изначально пустой, он нам нужен для хранения вопросов, которые уже задавались. Чтоб не повторяться.
После того как вопрос задан, он из очереди A попадает в очередь B. И так до тех пор пока не кончатся вопросы.

Алгоритм опроса можно представить в виде блок схемы:

После того как пользователь ответил на все вопросы, по параметрам и значениям осуществляется выборка.

Пожалуй, это все. Если возникли вопросы, я постараюсь помочь.

Понравилась статья? Подпишись на RSS.

Советую почитать:

Курсы валют на Вашем сайте

MooTools 1.2.3 - Релиз Авторизация

Комментарии

Здесь пока никто не писал.