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

       

где таблица Calendar содержит список


AND MONTH(tblTabel.Date) = Calendar.Month AND t.Day = 'd' +  CAST(Calendar.Day AS VARCHAR)

где таблица Calendar содержит список всех календарных дат (в разумном диапазоне) и имеет следующую структуру:

CREATE TABLE Calendar(
    [Date] [datetime],
    [Year] [int],
    [Month] [int],
    [Day] [int])

  • Возможности, продемонстрированные в пп. 2 и 3 показывают, что схемы действительно являются альтернативными и можно говорить о выборе между ними. (На самом деле схемы являются до конца эквивалентными лишь с учетом следующих ограничений: в модели фактов у одного человека в табеле в один день по конкретному виду оплаты труда не может быть двух записей, в модели строк – проще: на одного человека в табеле не может быть двух строк по одному виду оплаты. Если это соблюдается – приведенные выше операции pivot и unpivot будут обратными.)



    Рис. 4 Pivot и Unpivot преобразования

  • Проверка таблиц TabelFact и TabelRow на соответствие нормальным формам:
    1. Ни одно из полей обеих таблиц не содержит более одного значения и ни одно из ключевых полей не пусто – выполняется требование 1-й нормальной формы
    2. В TabelRow есть составной первичный ключ {idTabel, idPaymentType, idPerson} (в одном табеле не могут быть две строки с одним видом оплаты для одного человека), который связан полной функциональной зависимостью с любым полем, не входящим в первичный ключ. Аналогично – таблица TabelFact с составным ключом {idTabel, idPaymentType, idPerson, Date} (в один день не может быть зафиксировано два факта работы с одинаковым видом оплаты для одного и того же человека). В этой таблице остается лишь одно поле, не входящее в составной ключ – Hours оно не является функционально зависимым от части составного ключа – соответственно связано полной функциональной зависимостью с составным первичным ключом. – Для обеих таблиц выполняется требование 2-й нормальной формы.
    3. Неключевые поля обеих таблиц не зависят функционально от других неключевых полей: в TabelFact – одно неключевое поле (Hours), в TabelRow – неключевые поля h1-h31 на языке предметной области требование означает, что количество часов, отработанное человеком в какой-либо день месяца не должно зависеть функционально от количества часов, отработанного в другие дни – так оно и есть на самом деле.Таким образом, таблицы соответствуют 3-й нормальной форме.
    4. Таблицы соответствуют нормальной форме Бойса-Кодда, т.к. имеют всего по одному ключу – уже рассмотренному в пункте b.
    5. В таблицах нет многозначных зависимостей (многозначная зависимость не является функциональной, она существует в том случае, когда из факта, что в таблице содержится некоторая строка X, следует, что в таблице обязательно существует некоторая определённая строка Y). Соответственно – выполняются требования четвертой и пятой нормальных форм (они формулируются, как ограничения на существующие многозначные зависимости).


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


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