Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Веб-разработка? Это просто! Пивот или сводная таблица


Пивот или сводная таблица

Всем привет. Сегодня мы коснёмся одной очень интересной темы, которая очень слабо освещена в рунете. Тема эта больше теоретическая, и, скорее всего, в обычных проектах вы с этим не столкнётесь никогда, но уж если столкнётесь и не будете знать, что перед вами, пара-тройка бессонных ночей вам гарантированна. С другой стороны, если перед вами возникнет задача, где можно использовать пивот, вы сможете резко повысить производительность вашей системы. А для веб производительность всегда была критична. Попробуем же потратить пол часа сейчас и отлично выспаться потом, когда-нибудь в будущем :)

Итак, пивот. Что это такое и с чем его едят? Скажу сразу, к пиву это не имеет никакого отношения. А имеет отношения к реляционным базам данных, например, к MySQL. Пивот - это разворот таблицы. Или таблица разворота. Вот видите, это уже, практически, пивот. Придумали эту штуку два оч. умных дядьки - Бил Джелен и Майк Александер. Подробнее об истории пивота можно посмотреть в английской википедии (http://en.wikipedia.org/wiki/Pivot_table).

Приведём пример, чтобы понять, что такое пивот, т.к. без примера и на словах понять это практически невозможно (если Эйнштейн не был вашим дедушкой, а Тьюринг - братом, конечно).

Пусть есть исходная MySQL таблица, которая хранит результаты экзаменов -

CREATE TABLE exams (
  pkey int(11) NOT NULL auto_increment,
  name varchar(15),
  exam int,
  score int,
  PRIMARY KEY  (pkey)
);

+------+------+------+-------+
| pkey | name | exam | score |
+------+------+------+-------+
|    1 | Bob  |    1 |    75 |
|    2 | Bob  |    2 |    77 |
|    3 | Bob  |    3 |    78 |
|    4 | Bob  |    4 |    80 |
|    5 | Sue  |    1 |    90 |
|    6 | Sue  |    2 |    97 |
|    7 | Sue  |    3 |    98 |
|    8 | Sue  |    4 |    99 |
+------+------+------+-------+

Это обычная плоская таблица MySQL. Автоинкрементный первичный ключ нас вообще не интересует. В остальных колонках хранится номер экзамена и количество баллов, которые студент по имени name умудрился набрать (судя по всему, Sue вообще никогда не прогуливает). Понятно, что exam может быть в свою очередь внешним ключом для ссылки на другую таблицу с названием экзаменов, с экзаменаторами и т.д. Нам это не интересно.

При пивоте по экзамену результирующая таблица будет выглядеть так -

+------+-------+-------+-------+-------+
| name | exam1 | exam2 | exam3 | exam4 |
+------+-------+-------+-------+-------+
| Bob  |    75 |    77 |    78 |    80 |
| Sue  |    90 |    97 |    98 |    99 |
+------+-------+-------+-------+-------+

Сразу видно, насколько эта таблица полезнее. Например, если эти данные вернуть в PHP приложение, то обладая тем же набором данных мы сделаем всего лишь две итерации цикла для выборки всех данных из таблицы. Для первой плоской таблицы нам бы пришлось гонять цикл while все восемь раз. Согласитесь - прирост производительности в 4 раза - серьёзный аргумент за то, чтобы задуматься об использовании такого приёма. Как же получить такую пивот-таблицу? Для начала рассмотрим нематематический способ. Он ничем не хуже математического, но изначально пивот был изобретён для осуществления каких-то более осмысленных действий над данными, чем простая выборка, например - вычисление средних значений, вычисление разниц, использование каких-нибудь статистических функций с выбранными данными и т.п.

Продолжение статьи "Пивот или сводная таблица" а также другие статьи, посвященные веб-разработке, Вы можете прочитать на сайте "Веб-разработка? Это просто!".


В избранное