Невозможно предусмотреть все возможные запросы, которые могут понадобиться для составления отчетов по данным табельного учета. Тем не менее, логично предположить, что большинство запросов будут содержать фильтр данных по датам. Как это будет выглядеть для альтернативных моделей:
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.
Таким образом, по данному критерию привлекательнее выглядит модель А, однако в случае выбора модели Б проблема решается построение всего одного представления.