3 апр. 2008 г.

SQL Dating


Язык структурированных запросов SQL является идеальным средством для работы с информацией, хранящейся в базах данных. Он позволяет создавать сложные, но гибкие конструкции поиска, эффективно управлять данными и решать всевозможные практические задачи. Такие задачи постоянно возникают в процессе взаимодействия пользователя и изощренных систем управления базами данных, доведенных блестящим интеллектом разработчика до сложности, на порядок превышающей сложность этого самого интеллекта. Но мало кто знает, что этот же язык можно использовать и далеко за пределами СУБД. SQL позволяет эффективно описывать любые процессы, связанные с выбором и структурированием данных, возникающие в самых неожиданных сферах деятельности человека. Давайте для примера рассмотрим сложное психосоциальное явление, казалось бы, никоим образом не связанное со структурированными запросами, а именно, поиск спутника жизни. Поскольку язык SQL оперирует только понятиями из мира баз данных, нам потребуется представить рассматриваемое явление в несколько датафицированной форме, то есть попытаться описать его в терминах языка запросов.



Предположим, некий программист Иванов решил порвать с одиноким существованием и обзавестись подружкой. Для этого он составляет следующий запрос: (здесь и далее мы будем использовать диалект языка SQL принятый в СУБД MySQL как наиболее распространенный среди веб-разработчиков.)


SELECT id, name, phone_number FROM familiar_girls WHERE age >= 18 AND age <= 25 AND charm > 14 AND intellect > 16 AND eye_color = `blue` AND hair_natural_color = `blond` AND education = `PHd` AND breast_size >=3 AND weight <= 60 AND height >=170 AND height <= 180 AND smoking=`N` AND drinking = `N` AND drugs = `N` AND sense_of_humor = `good` AND marriage = `N` AND boyfriend = 'N' AND children=0;



Выполнив запрос, программист Иванов получает сообщение:


Empty set (0.00 sec)


Свидетельствующее о том, что его поиск не увенчался успехом. Поскольку выбор может осуществляться только из знакомых, то, для того чтобы изменить ситуацию, программист Иванов вынужден подумать над запросами, заполняющими данными денормализованную временную таблицу familiar_girls. В настоящий момент выборка данных для временной таблицы осуществляется только из таблиц: co_workers, fellow_students, schoolmates. Добавив сюда еще несколько таблиц, таких как gig_friends, club_friends, hangout_friends программист Иванов получает долгожданный результат:



+-----+------------+------------------+
| id  | name       | phone_number     |
+-----+------------+------------------+
| 765 | Julia      | +7 914 81 45 61  |
+-----+------------+------------------+

1 rows in set (0.48 sec)

Но тут выясняется еще одно неприятное обстоятельство: оказывается, девушка тоже составила свой SQL запрос, и сам Иванов не подпадает под заданные условия.

SELECT id, name, phone_number FROM familiar_boys WHERE age >25 AND age <= 30 AND charm > 16 AND intellect > 18 AND eye_color = `green` AND hair_natural_color = `blond` AND education = `PHd` weight >= 80 AND weight <= 100 AND height >=190 AND height <= 200 AND smoking=`Y` AND drinking = `Y` AND drugs = `N` AND sense_of_humor = `excellent` AND marriage = `N` AND boyfriend = 'N' AND girlfriend = `N` AND children =0 AND car = `Y` AND car_class IN(`Bentley `,`Porsche`, `Ferrari`) AND car_color=`#ffffff` AND business=`Y` AND nobility=`prince`;

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

SELECT id, name, phone_number FROM familiar_girls WHERE ivanov_is_cool(id) = `Y` AND age >= 18 AND age <= 25 AND charm >= 10 AND intellect > 10 AND education = `Higher` AND breast_size >=2 AND weight <= 70 AND height >=163 AND height <= 180 AND smoking=`N` AND drinking = `N` AND drugs = `N` AND sense_of_humor = `good` AND marriage = `N` AND boyfriend = 'N' AND children=0;
В результате выполнения модифицированного запроса получается вполне приемлемый результат:

+-----+------------+------------------+
| id  | name       | phone_number     |
+-----+------------+------------------+
|   1 | Anna       | +7 …             |
|  23 | Svetlana   | +7 …             |
|  64 | Kira       | +7 …             |
| 120 | Aleftina   | +8 …             |
| 365 | Rimma      | +7 …             |
+-----+------------+------------------+

5 rows in set (0.51 sec)

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

Так у девушки с id равным 1 параметр mother_normality имеет минусовое значение. У трех последующих с id 23, 64 и 120 превышен допустимый предел значения поля whoreness, а у последней с id равным 365 неожиданно высоким оказалось значение поля intellect, что иногда тоже напрягает. Но и в сложившейся ситуации язык SQL позволяет найти блестящее решение. Вместо того чтобы снова пересматривать секцию WHERE, Иванов принимает решение изменить сам алгоритм поиска. Он отказывается от жестких условий и переходит к сортировке по релевантности. Теперь SQL запрос принял вид:


SELECT id, name, phone_number FROM familiar_girls WHERE ivanov_is_cool(id) = `Y` ORDER BY relevant(id) DESC, breast_size, height DESC, name LIMIT 500;

А хранимая функция relevant() выглядит следующим образом:


CREATE FUNCTION relevant (id_girl INT(11)) RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
BEGIN
DECLARE retval INT DEFAULT 0;
SELECT age, charm, intellect, eye_color, hair_natural_color, education, breast_size, weight, height, sense_of_humor, marriage, boyfriend, children, mother_normality, whoreness INTO age, charm, intellect, eye_color, hair_natural_color, education, breast_size, weight, height, sense_of_humor, marriage, boyfriend, children, mother_normality, whoreness FROM familiar_girls WHERE id = id_girl;

SET retval = retval + breast_size;
SET retval = retval + mother_normality;
SET retval = retval - children * 3;
SET retval = retval + (charm - 11);
SET retval = retval + (intellect - 10);

IF intellect > 16 THEN SET retval = retval - (intellect - 9);
END IF;

IF boyfriend = `Y` THEN SET retval = retval – 5;
END IF;

IF marriage = `Y` THEN SET retval = retval – 10;
END IF;

IF whoreness < 3 THEN SET retval = retval + whoreness; ELSE SET retval = retval - whoreness; END IF; IF age < 18 THEN SET retval = retval + (age - 18) * 2; ELSEIF age > 25 THEN SET retval = retval - (age - 25) * 2;
ELSE SET retval = retval + 2;
END IF;

IF weight < 45 THEN SET retval = retval - 4; ELSEIF weight > 80 THEN SET retval = retval - 4;
ELSE SET retval = retval + 2;
END IF;

IF height < 160 THEN SET retval = retval - 2; ELSEIF height > 180 THEN SET retval = retval - 2;
ELSE SET retval = retval + 2;
END IF;

IF eye_color = `blue` THEN SET retval = retval + 1;
END IF;

IF hair_natural_color = `blond` THEN SET retval = retval + 1;
END IF;


CASE education
WHEN `PHd` THEN
SET retval = retval + 2;
WHEN `Higher` THEN
SET retval = retval + 1;
ELSE
SET retval = retval - 1;
END CASE;

CASE sense_of_humor
WHEN `excellent` THEN
SET retval = retval + 2;
WHEN `good` THEN
SET retval = retval + 1;
WHEN `bad ` THEN
SET retval = retval - 2;
END CASE;

RETURN retval;

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

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

3 комментария:

NAV!GAT0R комментирует...
Этот комментарий был удален автором.
NAV!GAT0R комментирует...

- эта пять!

особенно понравилась фраза:

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

А девченки в этой истории тоже неплохо владеют sql =\
Но лично я таких не видел!
Хотя знаю, что в одной конторе есть девчёнка ведущий web-программист =)

NAV!GAT0R комментирует...

по чему некто не комметируент ентот постенг?