Классика баз данных - статьи

       

Критерий простоты составления запросов для отчетных (аналитических) систем.


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

  • Модель А:

    SELECT *
    FROM TabelFact
    WHERE Date>=@BeginDate AND Date<=@EndDate

  • Модель Б:

    SELECT *
    FROM (
        SELECT     TabelRow.idPaymentType, Calendar.Date, TabelRow.idPerson,
               TabelRow.idTabel, TabelRow.h1 AS Hours
        FROM Tabel
               INNER JOIN TabelRow ON Tabel.idTabel = TabelRow.idTabel
               INNER JOIN Calendar ON YEAR(Calendar.Date) = YEAR(Tabel.Date)
                      AND MONTH(Calendar.Date) = MONTH(Tabel.Date) AND Calendar.Day = 1
        UNION
       
        SELECT     TabelRow.idPaymentType, Calendar.Date, TabelRow.idPerson,
               TabelRow.idTabel, TabelRow.h2 AS Hours
        FROM Tabel
               INNER JOIN TabelRow ON Tabel.idTabel = TabelRow.idTabel
               INNER JOIN Calendar ON YEAR(Calendar.Date) = YEAR(Tabel.Date)
                      AND MONTH(Calendar.Date) = MONTH(Tabel.Date) AND Calendar.Day = 2
        UNION
        ...
        UNION
        SELECT     TabelRow.idPaymentType, Calendar.Date, TabelRow.idPerson,
               TabelRow.idTabel, TabelRow.h31 AS Hours
        FROM Tabel
               INNER JOIN TabelRow ON Tabel.idTabel = TabelRow.idTabel
               INNER JOIN Calendar ON YEAR(Calendar.Date) = YEAR(Tabel.Date)
                      AND MONTH(Calendar.Date) = MONTH(Tabel.Date) AND Calendar.Day = 31 ) AS t
    WHERE Date>=@BeginDate AND Date<=@EndDate

Видно, что с точностью до наоборот повторяется ситуация с SELECT-запросами строк табеля. Теперь запрос в модели фактов выглядит намного лаконичнее. Опять же ситуацию можно поправить, используя представление (view) в случае выбора модели Б.

С точки зрения аналитических (OLAP) систем, известно, что для построения OLAP-куба необходима схема типа «снежинка», центром которой является таблица фактов, содержащая значения мер куба. Модель А идеально соответствует этому требованию, а в модели Б понадобиться построение unpivot-view для таблицы TabelRow.

Таким образом, по данному критерию привлекательнее выглядит модель А, однако в случае выбора модели Б проблема решается построение всего одного представления.



Содержание  Назад  Вперед