Предметная область примера – табельный учет рабочего времени. Основная информация, которую необходимо хранить в программе табельного учета – кто, когда, сколько часов отработал и по какому коду оплаты. Документальным отражением этой информации служит табель учета рабочего времени:
Рис 1. Табель учета рабочего времени (фрагмент)
Ниже приводятся две схемы данных, которые предлагается рассматривать как альтернативные для этой предметной области. Схемы упрощены, в реально работающем варианте базы намного больше полей и таблиц.
Рис.2 Схема данных – «Модель А»
На схеме:
Рис 3. Схема данных – «Модель Б»
Таблица TabelRow содержит строки табелей.
Предварительное сравнение этих схем показывает:
SELECT idTabel, idPaymentType, idPerson,
SUM(CASE DAY(Date) WHEN 1 THEN Hours ELSE 0 END) AS h1,
SUM(CASE DAY(Date) WHEN 2 THEN Hours ELSE 0 END) AS h2,
...
SUM(CASE DAY(Date) WHEN 31 THEN Hours ELSE 0 END) AS h31
FROM tblTabelFact
GROUP BY idTabel, idPaymentType, idPerson
или, для MS SQL-Server 2005:
SELECT idTabel, idPaymentType, idPerson,
[1] AS h1, [2] AS h2, [3] AS h3, [4] AS h4, [5] AS h5,
[6] AS h6, [7] AS h7, [8] AS h8, [9] AS h9, [10] AS h10,
[11] AS h11, [12] AS h12, [13] AS h13, [14] AS h14, [15] AS h15,
[16] AS h16, [17] AS h17, [18] AS h18, [19] AS h19, [20] AS h20,
[21] AS h21, [22] AS h22, [23] AS h23, [24] AS h24, [25] AS h25,