Главная страница
Навигация по странице:

  • Таблица 11.1.

  • 11.3. Процедура нормализации

  • 11.4. Построение даталогической (табличной) модели

  • Листинг 11.1. Блюда ("русифицированный" листинг)

  • Листинг 11.2. Состав ("русифицированный" листинг)

  • Листинг 11.3. Блюда (листинг на языке SQL)

  • Листинг 11.4. Состав (листинг на языке SQ L)

  • 11.5. Различные советы и рекомендации Векторы.

  • Неопределенные значения.

  • Кириллов В.В., Громов Г.Ю. - Введение в реляционные базы данных. Литература для вузов isbn 9785941577705 в книге рассматриваются основные понятия баз данных и систем управления ими


    Скачать 11.62 Mb.
    НазваниеЛитература для вузов isbn 9785941577705 в книге рассматриваются основные понятия баз данных и систем управления ими
    АнкорКириллов В.В., Громов Г.Ю. - Введение в реляционные базы данных.pdf
    Дата16.04.2018
    Размер11.62 Mb.
    Формат файлаpdf
    Имя файлаКириллов В.В., Громов Г.Ю. - Введение в реляционные базы данных.pdf
    ТипЛитература
    #18127
    страница14 из 28
    1   ...   10   11   12   13   14   15   16   17   ...   28
    Глава 11
    Нормализация
    11.1. О нормализации, функциональных
    и многозначных зависимостях
    Нормализация — это разбиение таблицы на две или более, обладающих луч- шими свойствами при включении, изменении и удалении данных. Оконча- тельная цель нормализации сводится к получению такого проекта базы дан- ных, в котором каждый факт появляется лишь в одном месте, т. е. исключена избыточность информации. Это делается не столько с целью эко- номии памяти, сколько для исключения возможной противоречивости хра- нимых данных.
    Как указывалось в разд. 3.1, каждая таблица в реляционной базе данных удовлетворяет условию, в соответствии с которым в позиции на пересечении каждой строки и столбца таблицы всегда находится единственное атомарное значение, и никогда не может быть множества таких значений. Любая табли- ца, удовлетворяющая этому условию, называется нормализованной (см. таб- лицы с рис. 10.1 и 10.2). Фактически, ненормализованные таблицы, т. е. таб- лицы, содержащие повторяющиеся группы (см. табл. 10.1), даже не допускаются в реляционной БД.
    Всякая нормализованная таблица автоматически считается таблицей в первой
    нормальной форме, сокращенно 1НФ. Таким образом, строго говоря, "норма- лизованная" и "находящаяся в 1НФ" означают одно и то же. Однако на прак- тике термин "нормализованная" часто используется в более узком смысле —
    "полностью нормализованная", который означает, что в проекте не наруша- ются никакие принципы нормализации.
    Теперь в дополнение к 1НФ можно определить дальнейшие уровни нормали- зации — вторую нормальную форму (2НФ), третью нормальную форму
    (3НФ) и т. д. По существу, таблица находится в 2НФ, если она находится

    Часть
    IV.
    Основы проектирования баз данных
    212
    в 1НФ и удовлетворяет, кроме того, некоторому дополнительному условию, суть которого будет рассмотрена далее. Таблица находится в 3НФ, если она находится во 2НФ и, помимо этого, удовлетворяет еще другому дополни- тельному условию и т. д.
    Таким образом, каждая нормальная форма является в некотором смысле бо- лее ограниченной, но и более желательной, чем предшествующая. Это свя- зано с тем, что "(N+1)-я нормальная форма" не обладает некоторыми непри- влекательными особенностями, свойственными "N-й нормальной форме".
    Общий смысл дополнительного условия, налагаемого на (N+1)-ю нормаль- ную форму по отношению к N-й нормальной форме, состоит в исключении этих непривлекательных особенностей. В разд. 10.3 мы выявляли непривле- кательные особенности табл. 10.2 и для их исключения выполняли "интуи- тивную нормализацию".
    Теория нормализации основывается на наличии той или иной зависимости между полями таблицы. Определены два вида таких зависимостей: функцио- нальные и многозначные.
    Функциональная зависимость. Поле Б таблицы функционально зависит от поля А той же таблицы в том и только в том случае, когда в любой заданный момент времени для каждого из различных значений поля А обязательно су- ществует только одно из различных значений поля Б. Отметим, что здесь до- пускается, что поля А и Б могут быть составными.
    Например, в таблице
    Блюда
    (см. рис. 10.2) поля
    Блюдо и
    Вид функционально зависят от ключа
    БЛ
    , а в таблице
    Поставщики поле
    Страна функционально за- висит от составного ключа (
    Поставщик, Город
    ). Однако последняя зависи- мость не является функционально полной, так как
    Страна функционально зависит и от части ключа — поля
    Город
    Полная функциональная зависимость. Поле Б находится в полной функцио- нальной зависимости от составного поля А, если оно функционально зависит от А и не зависит функционально от любого подмножества поля А.
    Многозначная зависимость. Поле А многозначно определяет поле Б той же таблицы, если для каждого значения поля А существует хорошо определен- ное множество соответствующих значений Б.
    Для примера рассмотрим табл. 11.1. В ней есть многозначная зависимость "
    Дисциплина-Преподаватель ": дисциплина (в примере Информатика) может читаться несколькими преподавателями (в примере Шипиловым и Голова- невским). Есть и другая многозначная зависимость "
    Дисциплина-Учебник ": при изучении Информатики используются учебники "Паскаль для всех" и "Язык Си". При этом
    Преподаватель и
    Учебник не связны функциональной

    Глава 11. Нормализация
    213
    зависимостью, что приводит к появлению избыточности (для добавления еще одного учебника придется ввести в таблицу две новых строки). Дело улуч- шается при замене этой таблицы на две: ("
    Дисциплина-Преподаватель"
    и "
    Дисциплина-Учебник"
    ).
    Таблица 11.1.
    Обучение
    Дисциплина
    Преподаватель
    Учебник
    Информатика
    Шипилов П. А.
    Форсайт Р. Паскаль для всех
    Информатика
    Шипилов П. А.
    Уэйт М. и др. Язык Си
    Информатика
    Голованевский Г. Л.
    Форсайт Р. Паскаль для всех
    Информатика
    Голованевский Г. Л.
    Уэйт М. и др. Язык Си
    11.2. Нормальные формы
    В разд. 11.1 было дано определение первой нормальной формы (1НФ). При- ведем здесь более строгое ее определение, а также определения других нор- мальных форм.
    Таблица находится в первой нормальной форме (1НФ) тогда и только тогда, когда ни одна из ее строк не содержит в любом своем поле более одного зна- чения и ни одно из ее ключевых полей не пусто.
    Из таблиц, рассмотренных в главе 10, не удовлетворяет этим требованиям
    (т. е. не находится в 1НФ) только табл. 10.1.
    Таблица находится во второй нормальной форме (2НФ), если она удовлетво- ряет определению 1НФ и все ее поля, не входящие в первичный ключ, связа- ны полной функциональной зависимостью с первичным ключом.
    Кроме табл. 10.1 не удовлетворяет этим требованиям только табл. 10.2.
    Как обосновано далее (пример 11.1), она имеет составной первичный ключ
    (Блюдо, Продукт, Поставщик, Город, Цена) и содержит множество неключевых полей (
    Вид
    ,
    Основа
    ,
    Выход и т. д.), зави- сящих лишь от той или иной части первичного ключа. Так поля
    Вид и
    Основа зависят только от поля
    Блюдо
    ,
    Статус
    — от поля
    Поставщик и т. п. Следова-

    Часть
    IV.
    Основы проектирования баз данных
    214
    тельно, эти поля не связаны с первичным ключом полной функциональной зависимостью.
    Ко второй нормальной форме приведены почти все таблицы с рис. 10.1 кроме таблицы
    Поставщики
    , в которой
    Страна зависит только от поля
    Город
    , кото- рый является частью первичного ключа
    (Поставщик, Город)
    . Последнее об- стоятельство приводит к проблемам при:

    включении данных (пока не появится поставщик из Вильнюса, нельзя за- фиксировать, что это город Литвы);

    удалении данных (исключение поставщика может привести к потере ин- формации о местонахождении города);

    обновлении данных (при изменении названия страны приходится про- сматривать множество строк, чтобы исключить получение противоречи- вого результата).
    Разбивая эту таблицу на две таблицы
    Поставщики и
    Города
    , можно исключить указанные аномалии.
    Что же касается таблиц с рис. 10.2, то ввод в них отсутствующих в предмет- ной области цифровых первичных и внешних ключей формально затрудняет процедуру выявления функциональных связей между этими ключами и ос- тальными полями. Действительно, легко установить связь между атрибутом
    Блюдо и
    Вид
    (блюда): Харчо — Суп, Лобио — Закуска и т. п., но нет прямой зависимости между полями
    БЛ
    и
    Вид
    (блюда), если не помнить, что значение
    БЛ
    соответствует номеру блюда.
    Для упрощения нормализации подобных таблиц целесообразно использовать следующую рекомендацию. При проведении нормализации таблиц, в кото- рые введены цифровые (или другие) заменители составных и (или) текстовых первичных и внешних ключей, следует хотя бы мысленно подменять их на исходные ключи, а после окончания нормализации снова восстанавливать.
    При использовании этой рекомендации таблицы с рис. 10.2 временно пре- вращаются в таблицы с рис. 10.1, а после выполнения нормализации и вос- становления полей
    БЛ
    ,
    ПР
    и
    ПС
    — в нормализованные таблицы.
    Таблица находится в третьей нормальной форме (3НФ), если она удовле- творяет определению 2НФ и ни одно из ее неключевых полей не зависит функционально от любого другого неключевого поля.
    После разделения таблицы
    Поставщики с рис. 10.1 на две части все таблицы этого проекта удовлетворяют определению 2НФ, а так как в них нет не- ключевых полей, функционально зависящих друг от друга, то все они на- ходятся в 3НФ.

    Глава 11. Нормализация
    215
    Как ни странно, этого нельзя сказать об аналогичных таблицах с рис. 10.2.
    Если забыть рекомендацию о подмене на время нормализации ключей
    БЛ
    ,
    ПР
    и
    ПС
    на
    Блюдо
    ,
    Продукт и
    (Поставщик, Город)
    , то среди этих таблиц появятся две, не удовлетворяющие определению 3НФ. Действительно, так как после ввода первичных ключей
    БЛ
    и
    ПР
    поля
    Блюдо и
    Продукт стали неключевы- ми — появились не существовавшие ранее функциональные зависимости между неключевыми полями:
    Блюдо

    Вид и
    Поставщик

    Страна
    Следовательно, для приведения таблиц
    Блюда и
    Продукты с рис. 10.2 к 3НФ их надо разбить на:
    Блюда(БЛ, Блюдо)
    Вид_блюда(БЛ, Вид)
    Продукты(ПР, Продукт) хотя интуиция подсказывает, что это лишнее разбиение, совсем не улуч- шающее проект базы данных.
    Столкнувшись с подобными несуразностями, которые могут возникать не только из-за введения кодированных первичных ключей, теоретики реляци- онных систем Кодд и Бойс обосновали и предложили более строгое опреде- ление для 3НФ, которое учитывает, что в таблице может быть несколько
    возможных ключей.
    Таблица находится в нормальной форме Бойса—Кодда (НФБК), если и толь- ко если любая функциональная зависимость между его полями сводится к полной функциональной зависимости от возможного ключа.
    В соответствие с этой формулировкой таблицы
    Блюда и
    Продукты с рис. 10.2, имеющие по паре возможных ключей (
    БЛ
    и
    Блюдо
    ) и (
    ПР
    и
    Продукт
    ) находятся в НФБК или в 3НФ.
    В следующих нормальных формах (4НФ и 5НФ) учитываются не только функциональные, но и многозначные зависимости между полями таблицы.
    Для их описания познакомимся с понятием полной декомпозиции таблицы.
    Полной декомпозицией таблицы называют такую совокупность произвольно- го числа ее проекций, соединение которых полностью совпадает с содержи- мым таблицы.
    Например, естественным соединением (см. разд. 3.3) таблиц с рис. 10.1 мож- но образовать исходную таблицу, приведенную на рис. 10.2. Следовательно, таблицы с рис. 10.1 и 10.2 являются полными декомпозициями табл. 10.2
    (универсального отношения
    COOK
    ).
    Теперь можно дать определения высших нормальных форм. И сначала будет дано определение для последней из предложенных — 5НФ.

    Часть
    IV.
    Основы проектирования баз данных
    216
    Таблица находится в пятой нормальной форме (5НФ) тогда и только тогда, когда в каждой ее полной декомпозиции все проекции содержат возможный ключ.
    Таблица, не имеющая ни одной полной декомпозиции, также находится в 5НФ.
    Четвертая нормальная форма (4НФ) является частным случаем 5НФ, когда полная декомпозиция должна быть соединением ровно двух проекций. Весь- ма не просто подобрать реальную таблицу, которая находилась бы в 4НФ, но не была бы в 5НФ.
    11.3. Процедура нормализации
    Как уже говорилось, нормализация — это разбиение таблицы на несколько, обладающих лучшими свойствами при обновлении, включении и удалении данных. Теперь можно дать и другое определение: нормализация — это про- цесс последовательной замены таблицы ее полными декомпозициями до тех пор, пока все они не будут находиться в 5НФ. На практике же достаточно привести таблицы к НФБК и с большой гарантией считать, что они находятся в 5НФ. Разумеется, этот факт нуждается в проверке, однако пока не сущест- вует эффективного алгоритма такой проверки. Поэтому остановимся лишь на процедуре приведения таблиц к НФБК.
    Эта процедура основывается на том, что единственными функциональными зависимостями в любой таблице должны быть зависимости вида K → F, где
    K — первичный ключ, а F — некоторое другое поле. Заметим, что это следу- ет из определения первичного ключа таблицы, в соответствии с которым K →
    F всегда имеет место для всех полей данной таблицы. "Один факт в одном месте" говорит о том, что не имеют силы никакие другие функциональные зависимости. Цель нормализации состоит именно в том, чтобы избавиться от всех этих "других" функциональных зависимостей, т. е. таких, которые име- ют иной вид, чем K → F.
    Если воспользоваться рекомендацией из разд. 11.2 и подменить на время нормализации коды первичных (внешних) ключей на исходные ключи, то, по существу, следует рассмотреть лишь два случая:
    1.
    Таблица имеет составной первичный ключ вида, скажем, (К1, К2), и включает также поле F, которое функционально зависит от части этого ключа, например, от К2, но не от полного ключа. В этом случае рекомен- дуется сформировать другую таблицу, содержащую К2 и F (первичный ключ — К2), и удалить F из первоначальной таблицы:
    Заменить T(K1, K2, F), первичный ключ (К1, К2), ФЗ К2

    F на T1(K1, K2), первичный ключ (К1, К2), и T2(K2, F), первичный ключ К2.

    Глава 11. Нормализация
    217
    2.
    Таблица имеет первичный (возможный) ключ К, не являющееся возмож- ным ключом поле F1, которое, конечно, функционально зависит от К, и другое неключевое поле F2, которое функционально зависит от F1. Реше- ние здесь, по существу, то же самое, что и прежде — формируется другая таблица, содержащая F1 и F2, с первичным ключом F1, и F2 удаляется из первоначальной таблицы:
    Заменить T(K, F1, F2), первичный ключ К, ФЗ F1

    F2 на T1(K, F1), первичный ключ К, и T2(F1, F2), первичный ключ F1.
    Для любой заданной таблицы, повторяя применение двух рассмотренных правил, почти во всех практических ситуациях можно получить, в конечном счете, множество таблиц, которые находятся в "окончательной" нормальной форме и, таким образом, не содержат каких-либо функциональных зависимо- стей вида, отличного от K → F.
    Для выполнения этих операций необходимо первоначально иметь в качестве входных данных какие-либо "большие" таблицы (например, универсальные отношения). Но нормализация ничего не говорит о том, как получить эти большие таблицы. Далее будет рассмотрена процедура получения таких ис- ходных таблиц, а здесь приведем примеры нормализации.
    Пример 11.1. Применим рассмотренные правила для полной нормализации универсального отношения
    COOK
    (табл. 10.2).
    1.
    Определение первичного ключа таблицы.
    Предположим, что каждое блюдо имеет уникальное название, относится к единственному виду и приготавливается по единственному рецепту, т. е. название блюда однозначно определяет его вид и рецепт. Предположим также, что название организации поставщика уникально для того города, в котором он расположен, и названия городов уникальны для каждой из стран, т. е. название поставщика и город однозначно определяют этого по- ставщика, а город — страну его нахождения. Наконец, предположим, что поставщик может осуществлять в один и тот же день только одну постав- ку каждого продукта, т. е. название продукта, название организации по- ставщика, город и дата поставки однозначно определяют вес и цену по- ставленного продукта. Тогда в качестве первичного ключа отношения
    COOK
    можно использовать следующий набор атрибутов:
    Блюдо
    ,
    Продукт
    ,
    Поставщик
    ,
    Город
    ,
    Цена
    2.
    Выявление полей, функционально зависящих от части составного ключа.
    Поля
    Вид и
    Основа функционально зависят только от поля
    Блюдо
    , т. е.
    Блюдо K

    Вид
    Блюдо K

    Основа

    Часть
    IV.
    Основы проектирования баз данных
    218
    Аналогичным образом можно получить зависимости:
    (Блюдо, Продукт) K

    Вес
    Город K

    Страна
    (Поставщик, Город) K

    Цена
    3.
    Формирование новых таблиц.
    Полученные функциональные зависимости определяют состав таблиц, ко- торые можно сформировать из данных универсального отношения:
    Блюда (Блюдо, Вид)
    Состав (Блюдо, Продукт, Вес (г))
    Города (Город, Страна)
    Поставки (Поставщик, Город, К_во, Цена)
    4.
    Корректировка исходной таблицы.
    После выделения из состава универсального отношения указанных ранее таблиц, там остались лишь сведения о поставщиках, для хранения кото- рых целесообразно создать таблицу
    Поставщики (Поставщик, Город) т. е. использовать часть исходного первичного ключа, так как остальные его части уже ничего не определяют.
    Таким образом, процедура последовательной нормализации позволила полу- чить проект, лучший, чем приведен на рис. 10.1.
    Пример 11.2. Для улучшения проекта, приведенного на рис. 10.2, нужно оп- ределить первичные ключи таблиц и выявить, нет ли в таблицах полей, зави- сящих лишь от части этих ключей. Такое поле есть только в одной таблице.
    Это поле
    Страна в таблице
    Поставщики
    . Выделяя его вместе с ключом
    Город в таблицу
    Страны
    , получим нормализованный проект.
    11.4. Построение даталогической
    (табличной) модели
    Рассмотренный в разд. 10.4 процесс построения концептуальной модели ба- зы данных должен быть продолжен построением ее табличной модели. Для этого необходимо:
    1.
    Представить каждый стержень (независимую сущность) таблицей базы данных (базовой таблицей) и специфицировать первичный ключ этой ба- зовой таблицы.

    Глава 11. Нормализация
    219
    2.
    Представить каждую ассоциацию (связь вида "многие-ко-многим" или "многие-ко-многим-ко-многим" и т. д. между сущностями) как базовую таблицу. Использовать в этой таблице внешние ключи для идентификации участников ассоциации и специфицировать ограничения, связанные с ка- ждым из этих внешних ключей.
    3.
    Представить каждую характеристику как базовую таблицу с внешним ключом, идентифицирующим сущность, описываемую этой характери- стикой. Специфицировать ограничения на внешний ключ этой таблицы и ее первичный ключ — по всей вероятности, комбинации этого внешнего ключа и свойства, которое гарантирует "уникальность в рамках описы- ваемой сущности".
    4.
    Представить каждое свойство (атрибут) как поле в базовой таблице, пред- ставляющей сущность, которая непосредственно описывается этим свой- ством.
    5.
    Для того чтобы исключить в проекте непреднамеренные нарушения каких-либо принципов нормализации, необходимо выполнить процедуру нормализации (см. разд. 11.3).
    6.
    Если в процессе нормализации было произведено разделение каких-либо таблиц, то следует модифицировать инфологическую модель базы данных и повторить перечисленные шаги.
    7.
    Указать ограничения целостности проектируемой базы данных и дать (если это необходимо) краткое описание полученных таблиц и их полей.
    Для примера приведем описания таблиц
    Блюда и
    Состав
    (листинги 11.1 и 11.2).
    Листинг 11.1. Блюда ("русифицированный" листинг)
    СОЗДАТЬ ТАБЛИЦУ Блюда
    ( БЛ Число(2),
    Блюдо Текст(60),
    Вид Текст(7),
    Основа Текст(6),
    Выход Число(4,1)
    );
    КОММЕНТАРИЙ К ТАБЛИЦЕ Блюда - 'Перечень блюд, известных шеф-повару';
    КОММЕНТАРИЙ К СТОЛБЦУ Блюда.БЛ - 'Код блюда';
    КОММЕНТАРИЙ К СТОЛБЦУ Блюда.Блюдо - 'Название блюда';
    КОММЕНТАРИЙ К СТОЛБЦУ Блюда.Вид - 'Вид блюда';
    КОММЕНТАРИЙ К СТОЛБЦУ Блюда.Основа - 'Основной продукт в блюде';
    КОММЕНТАРИЙ К СТОЛБЦУ Блюда.Выход - 'Масса порции готового блюда';

    Часть
    IV.
    Основы проектирования баз данных
    220
    ИЗМЕНИТЬ ТАБЛИЦУ Блюда - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Повтор кода блюда !" ПЕРВИЧНЫЙ КЛЮЧ (БЛ);
    ИЗМЕНИТЬ ТАБЛИЦУ Блюда - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Такое блюдо уже есть !" УНИКАЛЬНЫЙ КЛЮЧ (БЛ, Блюдо);
    ИЗМЕНИТЬ ТАБЛИЦУ Блюда - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Только Закуска,Суп,Горячее,Десерт,Напиток" ПРОВЕРЯТЬ
    (Вид ИЗ ('Закуска', 'Суп', 'Горячее', 'Десерт', 'Напиток'));
    ИЗМЕНИТЬ ТАБЛИЦУ Блюда - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Только Кофе,Крупа,Молоко,Мясо,Овощи,Рыба,Фрукты,Яйца !" ПРОВЕРЯТЬ
    (Основа ИЗ ('Кофе', 'Крупа', 'Молоко', 'Мясо', 'Овощи', 'Рыба',
    'Фрукты', 'Яйца'));
    Листинг 11.2. Состав ("русифицированный" листинг)
    СОЗДАТЬ ТАБЛИЦУ Состав
    (
    БЛ Число(2),
    ПР Число(2),
    Вес Число(3)
    );
    КОММЕНТАРИЙ К ТАБЛИЦЕ Состав - 'Состав блюд';
    КОММЕНТАРИЙ К СТОЛБЦУ БЛ - 'Код блюда';
    КОММЕНТАРИЙ К СТОЛБЦУ ПР - 'Код продукта';
    КОММЕНТАРИЙ К СТОЛБЦУ Вес - 'Масса продукта в блюде';
    ИЗМЕНИТЬ ТАБЛИЦУ Состав - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Состав не уникален !" ПЕРВИЧНЫЙ КЛЮЧ (БЛ, ПР);
    ИЗМЕНИТЬ ТАБЛИЦУ Состав - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Такого блюда нет !" ВНЕШНИЙ КЛЮЧ (БЛ)
    СВЯЗЬ Блюда (БЛ);
    ИЗМЕНИТЬ ТАБЛИЦУ Состав - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Такого продукта нет !" ВНЕШНИЙ КЛЮЧ (ПР)
    СВЯЗЬ Продукты (ПР);
    ИЗМЕНИТЬ ТАБЛИЦУ Состав - ДОБАВИТЬ ОГРАНИЧЕНИЕ
    "Вес должен быть между 1 и 500 !" ПРОВЕРЯТЬ (Вес МЕЖДУ 1 И 500);
    Естественно, что приведенные нестандартные листинги 11.1 и 11.2 сможет "понять" только гипотетическая СУБД. Понятным любой существующей
    СУБД может быть листинг, написанный с помощью предложений определения

    Глава 11. Нормализация
    221
    данных (Data Definition Language, DDL) языка SQL (см. часть V). Поэтому перепишем приведенные ранее листинги на язык SQL — листинги 11.3 и 11.4.
    Листинг 11.3.
    Блюда (листинг на языке SQL)
    CREATE TABLE Блюда
    (
    БЛ NUMBER(2),
    Блюдо VARCHAR2(60),
    Вид VARCHAR2(7),
    Основа VARCHAR2(6),
    Выход NUMBER(4,1),
    );
    COMMENT ON TABLE Блюда IS 'Перечень блюд, известных шеф-повару';
    COMMENT ON COLUMN Блюда.БЛ IS 'Код блюда';
    COMMENT ON COLUMN Блюда.Блюдо IS 'Название блюда';
    COMMENT ON COLUMN Блюда.Вид IS 'Вид блюда';
    COMMENT ON COLUMN Блюда.Основа IS 'Основной продукт в блюде';
    COMMENT ON COLUMN Блюда.Выход IS 'Масса порции готового блюда';
    ALTER TABLE Блюда
    ADD CONSTRAINT "Повтор кода блюда !" PRIMARY KEY (БЛ);
    ALTER TABLE Блюда
    ADD CONSTRAINT "Такое блюдо уже есть !" UNIQUE (БЛ, Блюдо);
    ALTER TABLE Блюда
    ADD CONSTRAINT "Только Закуска,Суп,Горячее,Десерт,Напиток"
    CHECK (Вид IN ('Закуска', 'Суп', 'Горячее', 'Десерт', 'Напиток'));
    ALTER TABLE Блюда
    ADD CONSTRAINT "Только Кофе,Крупа,Молоко,Мясо,Овощи,Рыба,Фрукты,Яйца !"
    CHECK (Основа IN ('Кофе', 'Крупа', 'Молоко', 'Мясо', 'Овощи', 'Рыба',
    'Фрукты', 'Яйца'));
    Листинг 11.4. Состав (листинг на языке SQ
    L)
    CREATE TABLE СОСТАВ
    (
    БЛ NUMBER(2),
    ПР NUMBER(2),
    Вес NUMBER(3)
    );

    Часть
    IV.
    Основы проектирования баз данных
    222
    COMMENT ON TABLE Состав IS 'Состав блюд';
    COMMENT ON COLUMN Состав.БЛ IS 'Код блюда';
    COMMENT ON COLUMN Состав.ПР IS 'Код продукта';
    COMMENT ON COLUMN Состав.Вес IS 'Масса продукта в блюде';
    ALTER TABLE Состав
    ADD CONSTRAINT "Состав не уникален !" PRIMARY KEY (БЛ, ПР);
    ALTER TABLE Состав
    ADD CONSTRAINT "Такого блюда нет !" FOREIGN KEY (БЛ)
    REFERENCES Блюда (БЛ);
    ALTER TABLE Состав
    ADD CONSTRAINT "Такого продукта нет !" FOREIGN KEY (ПР)
    REFERENCES Продукты (ПР);
    ALTER TABLE Состав
    ADD CONSTRAINT "Вес должен быть между 1 и 500 !"
    CHECK (Вес BETWEEN 1 AND 500);
    11.5. Различные советы и рекомендации
    Векторы. Представляйте векторы по столбцам, а не по строкам. Например, диаграмму продаж товаров x, y, ... за последние годы лучше представить в виде:
    ТОВАР МЕСЯЦ КОЛ-ВО
    -–––– ––––––– –––––– x ЯНВАРЬ 100 x ФЕВРАЛЬ 50 x ДЕКАБРЬ 360 y ЯНВАРЬ 75 y ФЕВРАЛЬ 144 y ДЕКАБРЬ 35 а не так, как показано далее:
    ТОВАР КОЛ-ВО КОЛ-ВО КОЛ-ВО
    ЯНВАРЬ ФЕВРАЛЬ ... ДЕКАБРЬ
    ––––– ––––––– ––––––– ––––––– x 100 50 ... 360 y 75 144 ... 35

    Глава 11. Нормализация
    223
    Одна из причин такой рекомендации заключается в том, что при этом значи- тельно проще записываются обобщенные (параметризованные) запросы. Рас- смотрите, например, как выглядит сравнение сведений из диаграммы продаж товара i в месяце с номером m со сведениями для товара j в месяце с номером n, где i, j, m и n — параметры.
    Неопределенные значения. Будьте очень внимательны с неопределенными
    (
    NULL
    ) значениями. В поведении неопределенных значений проявляется мно- го произвола и противоречивости. В разных СУБД при выполнении различ- ных операций (сравнение, объединение, сортировка, группирование и др.) два неопределенных значения могут быть или не быть равными друг другу.
    Они могут по-разному влиять на результат выполнения операций по опреде- лению средних значений и нахождения количества значений. Для исключе- ния ошибок в ряде СУБД существует возможность замены
    NULL
    -значения ну- лем при выполнении расчетов, объявление всех
    NULL
    -значений равными друг другу и т. п.

    1   ...   10   11   12   13   14   15   16   17   ...   28


    написать администратору сайта