Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65

Статья опубликована в рамках: XVIII Международной научно-практической конференции «Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ» (Россия, г. Новосибирск, 03 апреля 2017 г.)

Наука: Информационные технологии

Скачать книгу(-и): Сборник статей конференции

Библиографическое описание:
Тимофеева О.В., Каньшин Е.А. РЕАЛИЗАЦИЯ НЕЧЕТКИХ ЗАПРОСОВ НА ЯЗЫКЕ SQL ДЛЯ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ // Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ: сб. ст. по мат. XVIII междунар. студ. науч.-практ. конф. № 7(18). URL: https://sibac.info/archive/meghdis/7(18).pdf (дата обращения: 23.09.2021)
Проголосовать за статью
Конференция завершена
Эта статья набрала 139 голосов
Дипломы участников
Диплом лауреата
отправлен участнику

РЕАЛИЗАЦИЯ НЕЧЕТКИХ ЗАПРОСОВ НА ЯЗЫКЕ SQL ДЛЯ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ

Тимофеева Олеся Вячеславовна

студент 4 курса, факультет информатики, Самарский Университет им.С.П. Королёва,

РФ, г. Самара

Каньшин Евгений Алексеевич

студент 4 курса, факультет информатики, Самарский Университет им.С.П. Королёва,

РФ, г. Самара

Научный руководитель Додонов Михаил Витальевич

доцент, кафедра прикладной математики, Самарский Университет им.С.П. Королёва,

РФ, г. Самара

Запросы к базам данных - это один из основных инструментов выборки, обновления и обработки данных в таблицах базы данных. Запрос формирует пользовательское представление о данных, не обязательно отвечающее требованиям нормализации. Результат выполнения запроса — это новая, чаще всего временная, таблица, которая существует до закрытия запроса. Рассмотрим 2 группы пользовательских запросов, которые создаются на естественном языке: это детерминированные и нечеткие запросы.

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

Но всегда ли пользователи получают запрашиваемые ими данные в полном объеме с помощью запросов в реляционных базах данных? Для ответа на этот вопрос проанализируем пользовательские запросы наглядно.

Воспользуемся примером из [2].

Пусть «Cars» это реляционная база данных, которая содержит в себе таблицу, основными полями которой являются «Model», «Price» и «Engine_Power»:

 

Таблица 1.

Пример таблицы из базы данных «Cars».

Model

Price

Engine_Power

А

750000

99

В

383400

112

C

512 500

125

D

155000

65

E

985000

175

F

210000

78

 

 

1. Детерминированные запросы. Данные запросы, как правило, состоят из точных терминов и булевых операторов. Поиск по этим запросам ведется путем выбора подходящих данных из реляционной базы данных. К примеру, необходимо выполнить запрос "Получить список мощных, но приемлемых по цене автомобилей" (основываясь по Таблице 1). Формализуем этот запрос для того чтобы выполнить его на языке SQL. В этом запросе появятся конкретные числовые значения, достаточно субъективно определяющие понятия "мощный" и "приемлемый по цене". Наглядно такой запрос может выглядеть таким образом:

SELECT* FROM CARS

  WHERE CARS.PRICE <=500 AND CARS.ENGINE_POWER >120;

Данный запрос не даст результатов, хотя автомобили марок «B» и «C» почти удовлетворяют условиям запроса.

2. Нечеткие запросы. Математический аппарат нечеткой логики в запросах к базам данных был подробно рассмотрен в [2], поэтому приведем пример реализации.

Для внедрения на практике можно воспользоваться теорией нечетких множеств и его понятием «лингвистическая переменная» [2] для определения адекватных значений нечетких запросов.

Реализуем выполнение запроса на языке SQL. Для этого, как и в [2] зададим лингвистические термы для переменных "цена" и "мощность двигателя", а также построим функции принадлежности для лингвистических термов. Функции принадлежности выберем z-образного, трапецеидального и s-образного вида. Параметры функций принадлежности для переменной "цена": «Низкая» = [250, 300], «Средняя» = [250, 350, 500, 600], «Высокая» = [500, 650]. Для переменной "мощность двигателя": «Очень малая» = [50, 55], «Малая» = [50, 55, 60, 70],  «Средняя» =[60, 70, 100, 120], «Большая» = [110, 120].

 

Рисунок 1. Вид функции принадлежности для лингвистической переменной «цена».

 

Рисунок 2. Вид функции принадлежности для лингвистической переменной мощность.

 

Создадим дополнительные таблицы для хранения в них значений функции принадлежности параметров каждого автомобиля к каждому определенному множеству [1].

CREATE TABLE CarsPower (Mark VARCHAR2(30), O4Mal NUMBER, Mal NUMBER, Sred NUMBER, Bolsh NUMBER);

CREATE TABLE CarsPrice (Mark VARCHAR2(30), Nizk NUMBER, Sredn NUMBER, Vsok NUMBER);

Создадим триггер, автоматически срабатывающий при добавлении или изменении записи в главную таблицу "Cars", вызывающий процедуры, высчитывающие и заносящие в таблицу значения функций принадлежности [1].

CREATE OR REPLACE TRIGGER AutoIns BEFORE INSERT OR UPDATE ON Cars

FOR EACH ROW

BEGIN

ADD_CarsPrice(:NEW.Mark, :NEW.Price);

ADD_CARSPOWER(:NEW.Mark, :NEW.Engine_Power);

END AutoIns;

 

CREATE OR REPLACE PROCEDURE ADD_CarsPrice(NewMark VARCHAR2, NewPrice NUMBER) IS

N NUMBER := 0;

S NUMBER := 0;

V NUMBER := 0;

BEGIN

    IF NewPrice BETWEEN 0 AND 300 THEN

      IF NewPrice < 250 THEN N:=1;

      END IF;

      IF NewPrice > 250 THEN  N:=(300-NewPrice)/50;

      END IF;

   END IF;

 

   IF NewPrice BETWEEN 250 AND 600 THEN

      IF NewPrice BETWEEN 250 AND 350 THEN  S:=(NewPrice-250)/100;

      END IF;

      IF NewPrice BETWEEN 350 AND 500 THEN S:=1;

      END IF;

      IF NewPrice BETWEEN 500 AND 600 THEN  S:=(600-NewPrice)/100;

      END IF;

   END IF;

 

    IF NewPrice > 500 THEN

      IF NewPrice BETWEEN 500 AND 650 THEN  V:=(NewPrice-500)/150;

      END IF;

      IF NewPrice > 650 THEN  V:=1;

      END IF;

    END IF;

 

INSERT INTO CarsPrice(MARK, NIZK, SREDN, VSOK) VALUES (NewMark, N, S, V);

END ADD_CarsPrice;

 

CREATE OR REPLACE PROCEDURE ADD_CarsPower(NewMark VARCHAR2, NewPower NUMBER) IS

OM NUMBER := 0;

M NUMBER := 0;

S NUMBER := 0;

B NUMBER := 0;

BEGIN

IF NewPower BETWEEN 0 AND 55 THEN

IF NewPower < 50 THEN OM:=1;

END IF;

IF NewPower > 50 THEN   OM:=(55-NewPower)/5;

END IF;

END IF;

 

IF NewPower BETWEEN 50 AND 70 THEN

IF NewPower BETWEEN 50 AND 55 THEN  M:=(NewPower-50)/5;

END IF;

IF NewPower BETWEEN 55 AND 60 THEN   M:=1;

END IF;

IF NewPower BETWEEN 60 AND 70 THEN   M:=(70-NewPower)/10;

END IF;

END IF;

 

IF NewPower BETWEEN 60 AND 120 THEN

IF NewPower BETWEEN 60 AND 70 THEN  S:=(NewPower-60)/10;

END IF;

IF NewPower BETWEEN 70 AND 100 THEN   S:=1;

END IF;

IF NewPower BETWEEN 100 AND 120 THEN S:=(120-NewPower)/20;

END IF;

END IF;

 

IF NewPower > 110 THEN

IF NewPower BETWEEN 110 AND 120 THEN  B:=(NewPower-110)/10;

END IF;

IF NewPower > 120 THEN  B:=1;

END IF;

END IF;

INSERT INTO CarsPower(MARK, O4MAL, MAL, SRED, BOLSH) VALUES (NewMark, OM, M, S, B);

END ADD_CARSPOWER;

Теперь к таблице "Cars" можно формулировать естественные запросы на формализованном языке, не боясь потерять нужные данные, так как сложные запросы будут рассматриваться как логическое пересечение нечетких множеств, соответствующих отдельному подзапросу. Продемонстрируем это. Для удобства, создадим представление ViewCar [1], объединяющее в себе три полученных выше таблицы. Выполним к нему запрос, схожий по смыслу с детерминированным запросом, выполненным выше: "автомобиль со средней ценой и большой мощностью двигателя". Не составит большого труда создание процедуры, переводящей лингвистические термы в язык терминов SQL, определенных в данной схеме базы данных. В результате запрос на языке SQL в рамках реализованной нечеткой логики будет выглядеть так:

 

SELECT MARK, PRICE, ENGINE_POWER FROM ViewCar

WHERE PRICE=’СРЕДНЯЯ’ AND ENGINE_POWER=’БОЛЬШАЯ’;

В результате получим потерянные в детерминированном запросе данные:

 

Таблица 2

Результат запроса.

 

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

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

Заключение

Итак, в данной работе были рассмотрены различные варианты запросов к реляционным базам данных на языке SQL, которые подразделяются на детерминированные и нечеткие. Для реализации нечетких запросов к базам данных требуется время и дополнительная память, однако они заметно сокращают время неавтоматизированного перебора данных пользователями для получения необходимой информации. Обработка таких запросов в конечном итоге приводит к интеллектуальному поиску, когда точные атрибуты запроса неизвестны или неопределенны. Это значительно упрощает работу с большими объемами различных данных для пользователей.

 

Список литературы:

  1. Кузнецов, С. Базы данных. Вводный курс. [Электронный ресурс]. — Режим доступа. — URL: http://citforum.ru/database/advanced_intro/ (дата обращения 01.04.17)
  2. Тимофеева О.В., Каньшин Е.А. ПРИМЕНЕНИЕ НЕЧЕТКОЙ ЛОГИКИ В ЗАПРОСАХ К БАЗАМ ДАННЫХ // Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ: сб. ст. по мат. XLI междунар. студ. науч.-практ. конф. № 4(40).
Проголосовать за статью
Конференция завершена
Эта статья набрала 139 голосов
Дипломы участников
Диплом лауреата
отправлен участнику

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом