Программирование баз данных MS SQL Server (1084479), страница 82
Текст из файла (страница 82)
Кроме того, создается впечатление, что допустимо использование числовых обозначений номеров заказов (но по такому поводу всегда следует консультироваться с заказчиками), причем для автоматического формирования таких номеров может применяться механизм последовательной выработки чисел в форме столбца идентификации. При условии, что понадобится количество номеров заказов, достигающее 2 миллиардов (оставалось бы только позавидовать акционерам такой компании), потребовался бы тип данных Вкд1пг с еще большим форматом представления. (Обычно количество используемых идентификационных номеров, в данном случае номеров заказов, далеко не достигает предельного значения, обусловленного применением конкретного типа данных; следует лишь помнить, что для них необходимо оставлять дополнительное пространство, но в достаточно крупной схеме зачастую ошибки в большую сторону при выборе формата представления идентификаторов в базе данных не считаются достаточно серьезными.) Нормализация и другие важные проблемы проектирования 323 Что касается столбца Огс!егпаге, то первым побуждением обычно становится желание применить тип данных эюа11с!асес1юе.
При этом обычно напрашиваются такие соображения, что не требуется точность, которую обеспечивает тип данных с!асес1ше, кроме того, вряд ли в дальнейшем потребуются данные, относящиеся к далекому прошлому (по-видимому, достаточно будет хранить данные всего лишь за несколько лет). Тем не менее в этом случае используется тип данных с!асес1пе, а не экза11с!агег1юе. Это решения принято для облегчения задачи программистов, работающих на языке Ч(зпа! Вайс. В версиях Ч)эпа! Ваз(с, предшествующих тем версиям, которые вошли в состав инфраструктуры .ХЕТ, возникали трудности при использовании данных типа эша11с!агег1тге. Безусловно, такие сложности бьии преодолимыми, но для этого требовались определенные трудозатраты. В данном случае столбец оасес1ше применяется исключительно ради того, чтобы можно было упростить разработку прикладного программного обеспечения.
Заказчик данного приложения сообщил, что для представления данных в столбце Спэгоэзег!Ло достаточно пяти цифровых знаков (и это подтверждается представленными образцами данных). В этом случае не мешало бы также задать вопрос заказчику по поводу того, действительно ли в указанном столбце никогда не будут использоваться буквенные символы. Приняв предположение, что эти значения всегда будут фактически оставаться числовыми, можно воспользоваться для объявления столбца целочисленным типом данных, поскольку он предоставляет описанные ниже преимущества.
З Поиск данных ускоряется. О Формат внутреннего представления становится короче, поскольку 4 байтов вполне достаточно для представления десятичного числа. состоящего из 5 цифр, а для представления строки длиной 5 символов требуется не меньше 5 байтов (или 6 байтов, если используются символьные данные переменной длины). Следует отметить, что, (зассуждая в данном случае о фо)эмате тфедставления, мы рассматриваем лишь пример, поскольку в дейстпвипмльиости формат тфедставлвния номлфов заказчиков для эти! таблицы уже опфеделен в (тезультате того, сто между таблицами Огс)егэ и Соэготегэ уапановлена связь. Но поскольку п)пл описании таблицы Сиз гоюегэ речь не шла о формате пфедставления номеров заказчиков, это упущение было уст)танено в настоящем (зазделе.
Иногда после определения типов данных возникает также необходимость задать размеры столбцов, но для данной конкретной таблицы в этом нет необходимости, поскольку для всех типов данных выбраны постоянные размеры. На следующем этапе необходимо определить, допустимо ли применение в строке )ч)ПЕ);значений. В рассматриваемом случае можно быть уверенным в том, что в каждой строке обязательной является вся информация и эта информация должна быть доступной ко времени ввода заказа, поэтому использование Х!)Е)=значений не допускается.
Безусловно, под этим не под)зазумевоетсд что следует отхазатьсл от применения%) (:зно. чений во всех базах данных. В определеннь х ситуациях практически невозможно обойтись без их использования, поэтому такие "неапределенньм" значения являются вполне допустимыми. Тем не менее авттфчасто тфедпочитоет вводить в таких случаях в текстовые столб цтл действительные текстовые значения, котсфые соде)тжат строки, говсфящие о том, что значение не отфеделено (натфимф, "!та1 пе Уп)спок п "или чтото в этом ~юде). 324 Глава 8 Причина, по которой я предпочитаю такой подход, состоит в том, что применение%И.1.- зна иний способствует возникновению ошибок в такой же степени, как и применение необь явленных пе1зеиенных.
Обноружив в тайские неопределенное значение, невозможно определить, было ли зто значение введено намерензсо или остолоп таким, иохим было задано по умолчанию, поскольку прогуралсмист или пользователь просто забыл ввести в табьииузначение для соответствующей строки.
В последнем случае имеет меппо ошибхо в ззрогромме или упу ение в пРоьеессе ввода данных. На следующем этапе должно быть принято решение об использовании заданных по умолчанию значений. Для столбца Огбег1Р применяемое по умолчанию значение не может быть предусмотрено, поскольку значение в нем формируется по такому принципу, как в столбце идентификации (а эти два способа автоматического заполнения столбца являются взаимоисюзючающими). Но для столбца ОгдегРасе использование заданного по умолчанию значения имеет смысл. Если при вводе данных о заказе значение ОгдегРаье не будет задано, то может быть принято предположение, что датой ввода заказа должна счнтаты:я текущая дата. Наконец, что касается столбца Опзсотегио, то заранее нельзя узнать, от какого заказчика будет принят заказ, поэтому для него применяемое по умолчанию значение не предусмотрено.
После этого перенаем к решению вопроса об использовании столбца идентификации. Для применения в качестве столбца идентификации идеально подходит столбец Огбег1Р, поскольку представленные в нем значения предназначены исключительно для обеспечения уникальности строк. Применение счетчика, подобного заданному с помощью столбца идентификации, позволяет реализовать >добный, наглядный и единообразный способ обеспечения уникальности строк. Кроме того, отсутствуют какие-либо основания.
требующие изменения начального значения и приращения для столбца идентификации, поэтоьзз эти исходные параметры остаются неизменными. Отсчет значений в столбце начинается с единицы и каждый раз увеличивается на единицу. Теперь перейдем к рассмотрению следующей таблицы, ОгдегРееа11э, которая приведена на рис. 8.25. еис 8 25. ОпФеделение таблицы Охс1ехпееах1а Столбец Огдег1Р, который определен в этой таблице, должен быть обозначен как столбец, на котором объявлен внешний ключ, поэтому решение о выборе для него типа данных уже задано; этот столбец должен иметь такой же тип и размер представления данных, как и столбец, на который он ссылается, иными словами, он должен иметь тип данных ' пС. Отсчет позиций в заказе должен возобновляться с началом ввода каждого нового заказа, поэтому для столбца Рйпе1Сев достаточно предусмотреть применение типа данных С1пу1гС. Тем не менее исключительно ради безопасности в этом случае ис- Нормализация и другие важные проблемы проектирования 325 пользуется тип данных упг (поскольку на практике иногда встречаются случаи переполнения из-за превышения величины, допустимой для данных типа Супу(пг).
Для рассматриваемой таблицы формат представления столбца Раггко фактически уже предопределен в связи с тем, что этот столбец должен согласовываться со столбцом Рагсно таблицы Ргос(пссэ. В таблице Ргобпсгв для этого столбца будет применяться тип данных сваг (б) (дополнительная информация об этом приведена ниже), поэтому такой же тип данных выбран и здесь. При выборе подходящего типа данных для столбца Огу приходится прибегать к рассуждениям.
Проблема состоит в том, какое максимальное количество единиц для одного элемента заказа допускается использовать в заказе. В данном случае отсутствует информация о том, какие товары должны быть представлены в заказе, поэтому невозможно определить максимальное количество (например. если с помощью заказа должна быть выполнена поставка нефти, то объем единоразовой поставки может составлять миллионы баррелей). Кроме того, в рассматриваемом случае используется тип данных Рпс, но если бы с помощью заказов проводилась продажа таких товаров, для измерения количества которых применяются десятичные дробные числа (например, единицы объема или веса). то пришлось бы применить более подходящий для этого тип данных. А что касается столбца Рп1ГРг1се, то для него тип данных выбрать несложно,— поскольку в этом столбце должны быть представлены денежные значения, то в качестве типа данных необходимо выбрать аюпеу.
Переходя к следующему этапу анализа, снова отметим, что при вводе строк должны быть обязательно заданы значения для всех столбцов (и это неудивительно). Итак, и в данной таблице не допускается использование Х(11 )=значений в каком- либо из столбцов. Кроме того, очевидно, что для рассматриваемой таблицы также не имеет смысла предусматривать применение заданных по умолчанию значений, поэтому данный этап подготовки определения таблицы пропускается. Что касается использования столбца идентификации, то может возникнуть стремление обозначить в качестве столбца идентификации также и столбец Огбег1Р этой таблицы.
Но такое решение является неприемлемым. Следует помнить, что в столбце Огбег1Р таблицы ОгбегРеса11з должны находиться значения, согласующиеся со значениями в одном из столбцов др)той таблицы, Огоегз. В таблице Огдегэ уже заданы значения соответствующего столбца (в настоящем примере он определен как столбец идентификации, но может быть принят и другой способ формирования вводимых в него значений), поэтому в результате определения столбца Огбег1Р таблицы ОгбегРега11в как столбца идентификации возникнет коллизия.