Цель лекции
Изучив материал настоящей лекции, вы будете знать:
сможете:
и научитесь:
Литература: [2], [3], [37], [38].
В предыдущих лекциях мы изучали различные аспекты методов логического проектирования ХД. Методы логического проектирования основываются на абстрактном рассмотрении данных. Логическая модель никак не связана с конкретной реализацией модели в БД СУБД.
На практике ХД создаются и эксплуатируются как БД под управлением конкретной СУБД. БД, реализующие ХД, создаются на основе
Основными объектами логической модели данных являются сущности, атрибуты и взаимосвязи.
Далее, при изложении материала, мы будем предполагать, что имеем дело с реляционными или объектно-реляционными СУБД и соответствующими им диалектами SQL.
Можно выделить два этапа создания
На первом этапе в рамках требований реляционной модели создаются объекты хранения данных, соответствующие сущностям и взаимосвязям логической модели данных —
Главной целью второго этапа является обеспечение требуемого уровня производительности. Для достижения этой цели необходимо учитывать как особенности реализации СУБД, для которой создается физическая модель, так и особенности функционирования будущей информационной системы в целом. Обычно производительность БД измеряется в терминах производительности транзакций (transaction performance).
Для повышения
Одной из главных задач, которые обязан решить проектировщик на стадии проектирования физической модели ХД, является задача превращения объектов логической модели данных в объекты реляционной БД. Для решения этой задачи проектировщику необходимо знать: а) какими объектами располагает реляционная база данных в принципе; б) какие объекты поддерживает конкретная СУБД, которая выбрана для реализации базы данных.
Таким образом, мы предполагаем, что решение о выборе СУБД уже принято руководителем ИТ-проекта и согласовано с заказчиком базы данных, т.е. СУБД задана. Проектировщик ХД должен ознакомиться с документацией, в которой описан диалект SQL, поддерживаемый выбранной СУБД. В настоящей лекции предполагается, что была выбрана СУБД семейства MS SQL Server компании Microsoft, хотя подавляющая часть материала охватывает объекты в любой промышленной реляционной СУБД.
Иерархия объектов реляционной БД прописана в стандартах по SQL, в частности, в
(рис 11.1) Иерархия объектов реляционной базы данных, соответствующая стандарту SQL-92На самом нижнем уровне находятся объекты, с которыми работает реляционная БД, — столбцы (колонки) и строки. Они, в свою очередь, группируются в
Следует отметить, что ни одна из групп объектов стандарта SQL-92 не связана со структурами физического хранения информации в памяти компьютеров.
Помимо указанных на рисунке объектов в реляционной базе данных могут быть созданы
Под
Обычно процедура создания
Для проектировщика БД
Далее объекты БД будут определяться в контексте СУБД MS SQL Server 2005/2008. Такой подход принят потому, что проектирование физической модели БД выполняется для конкретной среды ее реализации.
На MS SQL Sever 2005
К числу основных объектов реляционных БД относятся
Для упрощения идентификации и именования объектов в базе данных поддерживаются такие объекты, как
Правила (Rules) – это декларативные выражения, ограничивающие возможные значения данных. Для формулировки правила используются допустимые предикатные выражения SQL.
Для обеспечения эффективного доступа к данным в реляционных СУБД поддерживается ряд других объектов:
Для обработки данных специальным образом или для реализации
Данные объекты реляционной базы данных представляют собой программы, т.е. исполняемый код. Этого код обычно называют серверным кодом (server-side code), поскольку он выполняется компьютером, на котором установлено ядро реляционной СУБД. Планирование и разработка такого кода является одной из задач проектировщика реляционной базы данных.
Функция (Function) — это объект базы данных, представляющий поименованный набор команд SQL и/или операторов специализированных языков обработки программирования базы данных, который при выполнении возвращает значение — результат вычислений.
Для эффективного управления разграничением доступа к данным поддерживается объект роль.
Роль (Role) – объект базы данных, представляющий собой поименованную совокупность привилегий, которые могут назначаться
В логической модели данных среда реализации не учитывается. В ней определяются атрибуты и их возможные значения, такие как строка, число или дата, в идеале атрибуту может назначаться домен. Домен — это просто тип атрибута, например, "Деньги" или "Рабочий день". Проектировщик может включить ряд проверок допустимости или правил обработки, например, требование, что значение должно быть положительным, ненулевым и иметь максимум два десятичных разряда (это полезно для вычисления сумм рублевых платежей, выставляемых банком на другой банк).
Использование доменов упрощает задачу обеспечения непротиворечивости на стадии логической модели данных. При переходе к проектированию
В контексте проектирования физической модели реляционной БД домен – это выражение, определяющее разрешенные значения для колонок (атрибутов) отношения. При описании
Пример 11.1. Колонку в базе данных можно описать следующим образом:
amount NUMBER (8,2) NOT NULL CONSTRAINT cc_limit_amnt CHECK (amount > 0)
В колонке "Сумма платежа" ( Amount ) можно размещать только числовые данные; точность этого значения — два значащих десятичных разряда ( NUMBER (8,2) ); она должна быть заполнена для каждой строки NOT NULL ); ее значение должно быть положительным CONSTRAINT cc_limit_amnt CHECK (amount > 0). Максимальное значение, которое может храниться в этом столбце, — 999999.99. В этом простом определении колонки мы фактически определили ряд неявных правил, проверку которых MS SQL Server принудительно включает при вводе данных в БД.
Как видно, дальнейшее определение домена колонки (после присвоения ей типа) выполняется проектировщиком с помощью уточнений правил изменения значений. Такие уточнения поддерживаются в SQL с помощью механизма
В
Тип данных — это спецификация, определяющая, какого рода данные могут храниться в объекте БД: целые числа, символы, данные
Все допустимые типы данных описаны в
Для всех типов данных определено так называемое нуль-значение, которое указывает на отсутствие данных в колонке указанного типа, т.е. то обстоятельство, что значение данных в текущий момент времени неизвестно.
Описание типов, данное в
MS SQL Server предоставляет набор системных типов данных, определяющих все типы данных, которые могут использоваться в нем. Можно также определять собственные типы данных в Transact-SQL или Microsoft .NET Framework. Псевдонимы типов данных основываются на системных типах. Пользовательские типы данных обладают свойствами, зависящими от методов и операторов класса, который создается для них на одном из языков программирования, поддерживающих .NET Framework.
При объединении одним оператором двух выражений с разными типами данных, параметрами сортировки, точностями, масштабами или длинами результат определяется следующим образом.
char, varchar, text, nchar, nvarchar или ntext.Типы данных в СУБД семейства MS SQL Server объединены в следующие категории:
| Тип данных | Синтаксис |
|---|---|
| Точные числа | |
bigint |
Целые значения в диапазоне от $$-2^{63}$$ до $$2^{63} - 1$$ |
int |
Целые значения в диапазоне от $$-2^{31}$$ до $$2^{31}-1$$ |
smallint |
Целые значения в диапазоне от $$-2^{15}$$ до $$2^{15)-1$$ |
tinyint |
Целые значения в диапазоне от 0 до 255 |
bit |
Целое число, равное 1, 0 или NULL |
decimal[ (p[ , s] )] и numeric[ (p[ , s] )] |
Числа с фиксированной точностью и масштабом. При использовании максимальной точности числа могут принимать значения в диапазоне от $$-10^{38}+1$$ до $$10^{38}-1$$.
|
money |
Денежные (валютные) значения в диапазоне от -922 337 203 685 477,5808 до 922 337 203 685 477,5807 |
smallmoney |
Денежные (валютные) значения в диапазоне от -214 748,3648 до 214 748,3647 |
| Приблизительные числа | |
float
|
Числовые значения с плавающей запятой в диапазонах: $$-1,79E^{308}$$ - $$-2,23E^{-308}$$ и $$2,23E^{-308}$$ - $$1,79E^{308}$$.
|
real |
Числовые значения с плавающей запятой в диапазонах: $$-3,40E^{38}$$ - $$-1,18E^{-38}$$ и $$1,18E^{-38}$$ - $$3,40E^{38}$$ |
| Дата и время | |
date |
Дата в формате ГГГГ-ММ-ДД. Диапазон значений от 0001-01-01 до 9999-12-31, от 1 января 1 года до 31 декабря 9999 года |
datetime |
Определяет дату, включающую время дня с долями секунды в 24-часовом формате, 1 января 1753 года - 31 декабря 9999 года, от 00:00:00 до 23:59:590,997 |
smalldatetime |
Определяет дату, сочетающуюся со временем дня. Время представлено в 24-часовом формате с секундами, всегда равными нулю (:00), без долей секунд, от 01.01.1900 до 06.06.2079, 1 января 1900 года - 6 июня 2079 года, от 00:00:00 до 23:59:59 |
time |
Определяет время дня. Время без учета часового пояса в 24-часовом формате, от 00:00:00.0000000 до 23:59:59.9999999 |
datetime2 |
Определяет дату, объединенную со временем дня в 24-часовом формате. От 0001-01-01 до 9999-12-31, с 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры, от 00:00:00 до 23:59:59.9999999 |
datetimeoffset |
Определяет дату, объединенную со временем дня, с учетом часового пояса в 24-часовом формате, от 0001-01-01 до 9999-12-31, с 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры, от 00:00:00 до 23:59:59.9999999 |
| Символьные строки | |
varchar [( n| max )] |
Символьные данные переменной длины, не в Юникоде. n может иметь значение от 1 до 8 000, max означает, что максимальный размер хранения равен $$2^{31}-1$$ байт. Размер хранения равен фактической длине данных плюс два байта. Введенные данные могут иметь длину 0 символов. varchar являются типы char или |
char [ ( n ) ] |
Символьные данные фиксированной длины, не в Юникоде, с длиной n байт. Значение n должно находиться в интервале от 1 до 8000. Размер хранения данных этого типа равен n байт. |
text |
Этот тип данных представляет данные, отличные от данных Юникод, с использованием кодовой страницы сервера. Максимальная длина данных - $$2^{31}$$ - 1 (2 147 483 647) символов. Если в кодовой странице сервера используются двухбайтовые символы, объем занимаемого типом пространства все равно не превышает 2 147 483 647 байт. Он может быть менее 2 147 483 647 байт - в зависимости от строки символов |
| Символьные строки в Юникоде | |
nchar [ ( n ) ] |
Символьные данные в Юникоде длиной в n символов. Аргумент n должен иметь значение от 1 до 4000. Размер хранилища вдвое больше n байт. nchar являются типы national char и |
nvarchar [(n|max )] |
Символьные данные в Юникоде переменной длины. Аргумент n может принимать значение от 1 до 4 000. Аргумент max указывает, что максимальный размер хранилища равен $$2^{31}-1$$ байт. Размер хранилища в байтах вдвое больше числа введенных символов + 2 байта. Введенные данные могут иметь длину в 0 символов. nvarchar являются типы national char и |
ntext |
Этот тип данных представляет символьные данные в Юникоде переменной длины, включающие до $$2^{30}$$ - 1 (1 073 741 823) символов. Объем занимаемого этим типом пространства (в байтах) в два раза превышает число символов. В спецификации SQL-2003 ntext является тип national text |
| Двоичные данные | |
binary [ ( n ) ] |
Двоичные данные фиксированной длины размером в n байт, где n - значение от 1 до 8000. Размер хранения составляет n байт |
varbinary [(n|max)] |
Двоичные данные переменной длины. n могут иметь значение от 1 до 8000; max означает максимальную длину хранения, которая составляет $$2^{31}-1$$ байт. Размер хранения - это фактическая длина введенных данных плюс 2 байта. Введенные данные могут иметь размер 0 символов. В SQL-2003 varbinary является binary |
image |
Этот тип представляет двоичные данные переменной длины, включающие от 0 до $$2^{31}$$ - 1 (2 147 483 647) байт |
| Прочие типы данных | |
timestamp |
Это тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Тип данных timestamp используется в основном в качестве механизма для отметки версий строк timestamp - всего лишь увеличивающееся значение, которое не сохраняет дату или время. Тип данных datetime используется для записи даты или времени |
xml ([CONTENT| DOCUMENT] xml_schema_collection ) |
Тип данных, в котором хранятся XML-данные. Можно хранить экземпляры xml в столбце либо в переменной типа xml.
|
sql_variant |
Столбец типа sql_variant может содержать строки различных типов данных. Например, столбец, определенный как sql_variant, может хранить значения int, binary и char |
table |
Особый тип данных, который можно использовать для хранения результирующего набора с целью последующей его обработки. Тип table применяется, главным образом, для временного хранения набора строк, возвращаемого в качестве результирующего набора возвращающей табличное значение функции |
cursor |
Тип данных для переменных или выходных параметров cursor, может принимать значение NULL |
Итак, мы рассмотрели основные объекты БД и допустимые типы данных, которыми располагает проектировщик ХД при использовании СУБД семейства MS SQL Server.
Далее поговорим об алгоритме создания физической модели ХД.
Рассмотрим в качестве примера логическую модель ХД типа "звезда" на рис 11.2 и построим на ее основе физическую модель ХД.
(рис 11.2) Логическая модель хранилища данныхЛогическая модель ХД, приведенная на рисунке, была разработана для анализа продаж компании в разрезах товаров, продавцов, покупателей, времени продаж. Она включает в себя четыре сущности для измерений: "Время" (Time), "Покупатель" (Customer), "Товар" (Product), "Продавец" (Employee) – и одну сущность для фактов "Продажи" (Sale).
Как видно из приведенной
Описание атрибутов модели приведено в табл. 11.2.
| Атрибут | Значение | Сущность |
|---|---|---|
Time_ID |
Идентификатор времени, ключ сущности | "Время" (Time) |
Year |
Год | "Время" (Time) |
Quarter |
Квартал года | "Время" (Time) |
Cust_ID |
Идентификатор покупателя, ключ сущности | "Покупатель" (Customer) |
FName |
Имя покупателя | "Покупатель" (Customer) |
LName |
Фамилия покупателя | "Покупатель" (Customer) |
Address |
Адрес покупателя | "Покупатель" (Customer) |
Company |
Место работы | "Покупатель" (Customer) |
Prod_ID |
Идентификатор товара, ключ сущности | "Товар" (Product) |
Name |
Наименование товара | "Товар" (Product) |
Size |
Габариты товара | "Товар" (Product) |
Unit_Price |
Цена за единицу товара | "Товар" (Product) |
Empl_ID |
Идентификатор продавца, ключ сущности | "Продавец" (Employee) |
Empl_FName |
Имя продавца | "Продавец" (Employee) |
Empl_LName |
Фамилия продавца | "Продавец" (Employee) |
City |
Населенный пункт | "Продавец" (Employee) |
Address |
Адрес месторасположения | "Продавец" (Employee) |
Sale_ID |
Идентификатор продаж, ключ сущности | "Продажи" (Sale) |
Amount |
Сумма платежа | "Продажи" (Sale) |
Quantity |
Количество | "Продажи" (Sale) |
После того как были рассмотрены документы, описывающие логическую модель ХД, задача проектировщика состоит в построении физической модели ХД, которая включает в себя следующие действия.
NOT NULL на значения колонок;Как указывалось выше, первый шаг в построении физической модели ХД есть идентификация
Для нашего учебного примера создадим пять
(рис 11.3) Создание таблиц физической модели хранилища данныхКогда проектировщик заканчивает обработку всех отношений логической модели данных, он должен еще раз проверить, соответствует ли число
Следующим шагом проектировщика ХД является определение колонок для
Сначала рассмотрим задачу добавления колонок. Колонка должна иметь имя. Имена атрибутов соответствующих отношений логической модели преобразуются в имена колонок в соответствии с правилами именования объектов, принятых в конкретной СУБД. Обычно, как указывалось выше, это SELECT.
(рис 11.4) Определение имен колонок таблиц физической модели хранилища данныхИмеется еще одна проблема в именовании колонок – имена колонок должны интерпретироваться
Для нашего учебного примера решение этой задачи сводится к перенесению атрибутов сущностей в поля соответствующих
Заметим, что для соблюдения принципа уникальности имен полей в рамках модели при определении полей на основе имен атрибутов сущностей мы изменили некоторые имена. Так, имя атрибута "Адрес" (Address) сущности "Продавцы" (Employee) в соответствующей
После идентификации колонок необходимо задать их тип в соответствии с допустимыми для данной СУБД типами данных. Эта задача упрощается, если в отношениях логической модели определены домены атрибутов. Некоторые из доменов могут быть определены уже в терминах СУБД. Для таких атрибутов практически ничего делать не нужно. Определение домена в терминах типа данных СУБД нужно просто перенести в DEC(9,2), а из контекста предметной области следует, что в этой колонке будет накапливаться итоговая сумма расходов за год, то, может быть, целесообразно определить тип как DEC(15,2), чтобы избежать возможного переполнения при работе приложений базы данных.
Если домен определен не в терминах СУБД, проектировщик базы данных должен преобразовать его в подходящий тип данных. При выполнении таких преобразований следует учитывать ряд факторов.
varchar(3), и она содержит код, значение которого изменяется в интервале от '10A' до '99Z', то целесообразно с точки зрения хранения изменить тип этой переменной на char(3). Это объясняется тем, что тип varchar при физическом хранении занимает на байт-два больше, чем тип char при одной и той же объявленной длине.DEC. Он обрабатывается процессором быстрее, чем тип FLOAT. Исключение составляют данные для научных расчетов, где INT и SMALLINT исключительно для счетчиков.CHAR для DATE и TIME только для хранения хронологических данных.DATETIME исключительно для целей управления данными.
(рис 11.5) Определение типов данных для колонок таблиц физической модели хранилища данныхВ нашем учебном примере для всех атрибутов задан домен. Для суррогатных первичных bigint, а для остальных атрибутов — тип данных integer. Домен "Текст" можно представить типом данных varchar(n), для numeric (p, s ).
Результат определения типов колонок
После определения всех колонок и их типов следует перейти к идентификации первичных ключей таблицы. Согласно требованиям реляционной теории каждая строка
Задание колонки как первичного ключа в контексте многих СУБД, в том числе и семейства MS SQL Server, считается
Для нашего примера мы уже определили первичные ключи
После выполнения вышеперечисленных действий задачу определения первичных ключей
При определении
Предопределенное значение колонки, равное NULL, означает, что в данный конкретный момент для данной конкретной строки (экземпляра сущности предметной области) значение не определено, или неизвестно, или отсутствует. Проектировщику базы данных необходимо идентифицировать возможность колонки принимать NULL-значения, т.к. у
Примером проблемы может служить ситуация, в которой
При назначении NULL-значений колонкам проектировщику необходимо принимать во внимание следующие факторы.
NOT NULL, т.к. согласно реляционной теории значения колонок первичного ключа должны быть определены и уникальны для каждого кортежа.NOT NULL, и поскольку SET NULL должны определяться со спецификацией NULL.NOT NULL WITH DEFAULT для колонок с типами данных DATE или TIME, чтобы сохранять текущие даты и текущее время автоматически.NOT NULL WITH DEFAULT для всех колонок, которые не подпадают под перечисленные выше правила.Для нашего учебного примера все колонки
(рис 11.6) Задание ограничений NOT NULL на значения колонок
Следующим шагом в моделировании физической модели ХД является установление взаимосвязи между
Таблица реляционной базы данных, содержащая первичный ключ, называется
Отношение "родитель-потомок" между
Отношения "родитель-потомок" между двумя
Установив связь "родитель-потомок" между
(рис 11.7) Задание ограничений NOT NULL на значения колонокВопрос, который необходимо решить при моделировании ХД, состоит в том, будут ли внешние ключи измерений элементами составного первичного ключа
В нашем примере Sale_ID ), поэтому внешние ключи, реализующие отношение "родитель-потомок" между
После создания физической модели ХД проектировщик ХД может перейти к решению задачи разработки скрипта для создания ХД. Эта задача может быть решена и вручную, как мы сделаем это в следующем разделе настоящей лекции, и при помощи CASE-средств.
Для определения и создания
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { <column_definition> | <computed_column_definition>
| <column_set_definition> }
[ <table_constraint> ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name | filegroup
| "default" } ]
[ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
[ SPARSE ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( < index_option > [ , ...n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
[
WITH FILLFACTOR = fillfactor
|WITH ( <index_option> [ , ...n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<table_option> ::=
{
DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF}
| ALLOW_PAGE_LOCKS ={ ON | OFF}
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Рассмотрим элементы и аргументы команды CREATE TАBLE.
database_name. Имя БД, в которой создается database_name должно быть указано имя существующей БД. Если аргумент database_name не указан, по умолчанию database_name, и этот CREATE TABLE.schema_name. Имя table_name. Имя новой table_name может состоять не более чем из 128 символов, за исключением имен локальных временных column_name. Имя столбца в column_name может содержать от 1 до 128 символов. При создании столбцов с типом данных timestamp аргумент column_name может быть пропущен. Если аргумент column_name не указан, столбцу типа timestamp по умолчанию присваивается имя timestamp.computed_column_expression. Выражение, определяющее значение вычисляемого столбца. Вычисляемый столбец представляет собой виртуальный столбец, физически не хранящийся в PERSISTED. Значение столбца вычисляется на основе выражения, использующего другие столбцы той же cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, функцией, переменной или любой их комбинацией, соединенной одним или несколькими операторами. Выражение не может быть вложенным запросом или содержать типы данных "псевдонимы".Вычисляемые столбцы могут использоваться в списках выборки, предложениях WHERE, ORDER BY и в любых других местах, в которых могут применяться обычные выражения, за исключением следующих случаев.
DEFAULT или FOREIGN KEY, ни вместе с определением NOT NULL. Однако вычисляемый столбец может использоваться в качестве ключевого столбца PRIMARY KEY или UNIQUE, если значение этого вычисляемого столбца определяется детерминистическим выражением и тип данных результата разрешен в столбцах a и b, вычисляемый столбец a+b может быть включен в a+DATEPART(dd, GETDATE()) — не может, так как его значение может изменяться при последующих вызовах.INSERT или UPDATE.PERSISTED. Указывает, что SQL Server PERSISTED для вычисляемого столбца позволяет создать PERSISTED. Если указан признак PERSISTED, аргумент computed_column_expression должно быть детерминистическим.ON { <partition_scheme> | filegroup | "default" }. Указывает <partition_scheme> указан, <partition_scheme>. Если указан аргумент filegroup, "default", или параметр ON не определен вообще, CREATE TABLE, изменить в дальнейшем невозможно.Параметр ON {<partition_scheme> | filegroup | "default"} может также указываться в PRIMARY KEY или UNIQUE. С помощью этих filegroup, "default" или параметр ON не определен вообще, PRIMARY KEY или UNIQUE создает кластеризованный CLUSTERED или другим способом), то указанный аргумент <partition_scheme> отличается от аргументов <partition_scheme> и filegroup из определения
TEXTIMAGE_ON { filegroup | "default" }. Ключевые слова, указывающие, что столбцы типов text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max), а также пользовательских типов среды CLR хранятся в определенной файловой группе.Параметр TEXTIMAGE_ON недопустим, если в TEXTIMAGE_ON одновременно с параметром <partition_scheme>. Если указано значение "default" или параметр TEXTIMAGE_ON не определен вообще, столбцы с большими значениями сохраняются в установленной по умолчанию файловой группе. Способ хранения любых данных столбцов с большими значениями, определенный инструкцией CREATE TABLE, изменить в дальнейшем невозможно.
FILESTREAM_ON { partition_scheme_name | filegroup | "default" }. Задает файловую группу для данных FILESTREAM.Если FILESTREAM и является секционированной, необходимо включить предложение FILESTREAM_ON и указать
Если FILESTREAM не может быть секционирован. Данные FILESTREAM для FILESTREAM_ON.
Если FILESTREAM_ON не указано, используется файловая группа FILESTREAM, для которой задано свойство DEFAULT. При отсутствии файловой группы FILESTREAM возникает ошибка.
Как и в случае с предложениями ON и TEXTIMAGE_ON, значение, указанное с помощью инструкции CREATE TABLE для предложения FILESTREAM_ON, не может быть изменено, за исключением следующих ситуаций.
CREATE INDEX преобразует кучу в кластеризованный FILESTREAM, NULL.DROP INDEX преобразует кластеризованный FILESTREAM, "default".[ type_schema_name. ] type_name. Указывает Тип данных может быть одним из следующих.
CREATE TYPE . Состояние признака NULL или NOT NULL для типа данных – псевдонима может быть переопределено с помощью инструкции CREATE TABLE. Однако его длину изменить нельзя; длина типа данных – псевдонима не определяется инструкцией CREATE TABLE.CREATE TYPE . Для создания столбца с пользовательским типом среды CLR требуется разрешение REFERENCES на этот тип.precision. Точность указанного типа данных.Scale. Масштаб указанного типа данных.Max. Применяется только к типам данных varchar, nvarchar и varbinary для хранения $$2^{31}$$ байт символьных и двоичных данных или 2^30 байт данных в Юникоде.CONTENT. Указывает, что каждый экземпляр типа данных xml в столбце column_name может содержать несколько элементов верхнего уровня. Аргумент CONTENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection. Если этот параметр не указан, CONTENT принимается в качестве поведения по умолчанию.DOCUMENT. Указывает, что каждый экземпляр типа данных xml в столбце column_name может содержать только один элемент верхнего уровня. Аргумент DOCUMENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection.xml_schema_collection.. Применим только к типу данных xml для коллекции XML- CREATE XML SCHEMA COLLECTION.DEFAULT. Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY. Если значение по умолчанию указывается для столбца определяемого constant_expression в определяемый DEFAULT удаляются, когда NULL. Для совместимости с более ранними версиями SQL Server параметру DEFAULT может быть присвоено имя constant_expression. Константа, значение NULL или системная функция, используемая в качестве значения столбца по умолчанию.IDENTITY. Указывает, что новый столбец является столбцом идентификаторов. При добавлении в Database Engine формирует для этого столбца уникальное последовательное значение. Столбцы идентификаторов обычно используются с PRIMARY KEY для поддержания уникальности идентификаторов строк в IDENTITY может быть назначено столбцам типов tinyint, smallint, int, bigint, decimal(p,0) или numeric(p,0). Для каждой DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указать как начальное значение, так и приращение, или же не указывать ничего. Если ни одно из значений не указано, то действительно значение по умолчанию — (1,1).Seed. Значение, используемое для самой первой строки, загружаемой в Increment. Значение приращения, добавляемое к значению идентификатора предыдущей загруженной строки.NOT FOR REPLICATION. В инструкции CREATE TABLE предложение NOT FOR REPLICATION может указываться для свойства IDENTITY, а также FOREIGN KEY и CHECK. Если это предложение указано для свойства IDENTITY, значения в столбцах идентификаторов не приращиваются, когда вставку выполняют агенты репликации. Если ROWGUIDCOL. Указывает, что новый столбец является столбцом идентификаторов GUID. В качестве столбца ROWGUIDCOL можно назначить только один столбец uniqueidentifier в ROWGUIDCOL позволяет ссылаться на столбец с помощью ключевого слова $ROWGUID. Свойство ROWGUIDCOL можно присвоить только столбцу, имеющему тип uniqueidentifier. Ключевое слово ROWGUIDCOL недопустимо, если уровень совместимости базы данных равен 65 или ниже. Ключевым словом ROWGUIDCOL нельзя обозначать столбцы пользовательских типов данных.Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце. Кроме того, при указании данного свойства автоматическое формирование значений для новых строк, вставляемых в INSERT функции NEWID или NEWSEQUENTIALID либо использовать эти функции по умолчанию для столбца.
SPARSE . Указывает, что столбец является разреженным столбцом. Хранилище разреженных столбцов оптимизируется для значений NULL. Для разреженных столбцов нельзя указать параметр NOT NULL.FILESTREAM. Допустимо только для столбцов типа varbinary(max). Указывает хранилище FILESTREAM для данных BLOB типа varbinary(max).uniqueidentifier с атрибутом ROWGUIDCOL. Этот столбец не должен допускать значений NULL и должен иметь UNIQUE или PRIMARY KEY. Значение идентификатора GUID для столбца должно быть предоставлено приложением во время вставки данных или DEFAULT, в котором используется функция NEWID ().
Столбец ROWGUIDCOL нельзя удалить и связанные FILESTREAM. Столбец ROWGUIDCOL можно удалить только после удаления последнего столбца FILESTREAM.
Если для столбца указан атрибут хранилища FILESTREAM, то все значения для этого столбца хранятся в контейнере данных FILESTREAM в файловой системе.
COLLATE collation_name. Задает параметры сортировки для столбца. Имя параметров сортировки может быть либо именем параметров сортировки Windows, либо именем параметров сортировки SQL. Аргумент collation_name применим только к столбцам типов данных char, varchar, text, nchar, nvarchar и ntext. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки пользовательского типа (если столбец принадлежит к пользовательскому типу данных), либо установленные по умолчанию параметры сортировки для базы данных.CONSTRAINT. Необязательное ключевое слово, указывающее на начало определения PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY или CHECK.constraint_name. Имя NULL | NOT NULL. Определяет, допустимы ли для столбца значения NULL. Параметр NULL не является NOT NULL. NOT NULL может быть указано для вычисляемых столбцов только в случае если одновременно указан параметр PERSISTED.PRIMARY KEY. PRIMARY KEY для UNIQUE. UNIQUE.CLUSTERED | NONCLUSTERED. Указывает, что для PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный PRIMARY KEY по умолчанию создается кластеризованный CLUSTERED ), а для UNIQUE — некластеризованный ( NONCLUSTERED ).В инструкции CREATE TABLE параметр CLUSTERED можно задать только для одного UNIQUE указан параметр CLUSTERED и, кроме того, указано PRIMARY KEY, то для PRIMARY KEY применяется по умолчанию значение NONCLUSTERED.
FOREIGN KEY REFERENCES. FOREIGN KEY требуют, чтобы каждое значение в столбце существовало в соответствующем связанном столбце или столбцах в связанной FOREIGN KEY могут ссылаться только на столбцы, являющиеся PRIMARY KEY или UNIQUE в связанной UNIQUE INDEX связанной PERSISTED.[ schema_name . ] referenced_table_name ]. Имя FOREIGN KEY, и ( ref_column [ ,... n ] ). Столбец или список столбцов из FOREIGN KEY.ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }. Определяет операцию, которая производится над строками создаваемой NO ACTION.NO ACTION. Компонент Database Engine инициирует ошибку, и производится откат операции удаления строки CASCADE. Если из SET NULL . Все значения, составляющие внешний ключ, при удалении соответствующей строки NULL. Для выполнения этого NULL.SET DEFAULT . Все значения, составляющие внешний ключ, при удалении соответствующей строки NULL и множество значений по умолчанию не задано явно, NULL становится неявным значением по умолчанию для данного столбца.ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }. Указывает, какое действие совершается над строками в изменяемой NO ACTION.NO ACTION. Компонент Database Engine возвращает ошибку, и обновление строки CASCADE. Соответствующие строки обновляются в ссылающейся SET NULL . Всем значениям, составляющим внешний ключ, присваивается значение NULL, когда обновляется соответствующая строка в NULL.SET DEFAULT . Всем значениям, составляющим внешний ключ, присваивается их значение по умолчанию, когда обновляется соответствующая строка в NULL и множество значений по умолчанию не задано явно, NULL становится неявным значением по умолчанию для данного столбца.CHECK. CHECK в вычисляемых столбцах должны быть также помечены как PERSISTED.logical_expression. Логическое выражение, возвращающее значения TRUE или FALSE. Типы данных "псевдонимы" частью выражения быть не могут.Column. Столбец или список столбцов (в скобках), который применяется в [ ASC | DESC ]. Указывает порядок сортировки столбца или столбцов, участвующих в ASC — по возрастанию, DESC — по убыванию. Значение по умолчанию — ASC.partition_scheme_name. Имя [ partition_column_name. ]. Указывает столбец, по которому будет секционирована partition_scheme_name. Вычисляемый столбец, участвующий в PERSISTED.WITH FILLFACTOR = fillfactor. Указывает, насколько плотно компонент Database Engine должен заполнять каждую страницу fillfactor могут находиться в диапазоне от 1 до 100. Если значение не задано, по умолчанию оно принимается равным 0. Значения фактора заполнения 0 и 100 во всех отношениях считаются равнозначными.column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS. Имя набора столбцов. Набор столбцов представляет собой нетипизированное XML-представление, в котором все разреженные столбцы < table_option> ::= Указывает один или более параметров DATA_COMPRESSION. Задает режим сжатия данных для указанной NONE. ROW. PAGE. ON PARTITIONS ( { <выражение_номера_секции> | <диапазон> } [ ,...n ] ). Указывает DATA_COMPRESSION. Если ON PARTITIONS приведет к формированию ошибки. Если не указано предложение ON PARTITIONS, параметр DATA_COMPRESSION применяется ко всем <Выражение_номера_секции> можно указать одним из следующих способов:
ON PARTITIONS (2) ;ON PARTITIONS (1, 5) ;ON PARTITIONS (2, 4, 6 TO 8).<Диапазон> можно указать номерами TO, например: ON PARTITIONS (6 TO 8).
Чтобы для разных DATA_COMPRESSION несколько раз:
<index_option> ::= Указывает один или более параметров PAD_INDEX = { ON | OFF }. Если указано значение ON, процент свободного места, определяемый параметром FILLFACTOR, применяется к страницам OFF или значение FILLFACTOR не указано, страницы промежуточного уровня заполняются до приблизительного объема, оставляющего достаточно места, как минимум, для одной строки максимального размера, которого может достигать OFF.FILLFACTOR = fillfactor. Указывает процентное соотношение, определяющее, насколько заполненным компонент Database Engine должен делать конечный уровень каждой страницы fillfactor должен быть целым числом в диапазоне от 1 до 100. Значение по умолчанию равно 0. Значения фактора заполнения 0 и 100 во всех отношениях считаются равнозначными.IGNORE_DUP_KEY = { ON | OFF }. Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения CREATE INDEX, ALTER INDEX или UPDATE. Значение по умолчанию — OFF.ON. Если в уникальный OFF. Если в уникальный INSERT.IGNORE_DUP_KEY. Нельзя установить в значение ON для STATISTICS_NORECOMPUTE = { ON | OFF }. Если указано значение ON, автоматический пересчет устаревших статистик OFF, включается автоматическое обновление статистик. Значение по умолчанию — OFF.ALLOW_ROW_LOCKS = { ON | OFF }. Если указано значение ON, при доступе к Database Engine . При значении OFF блокировки строк не используются. Значение по умолчанию — ON.ALLOW_PAGE_LOCKS = { ON | OFF }. Если указано значение ON, при доступе к Database Engine . При значении OFF блокировки страниц не используются. Значение по умолчанию — ON.Выше было дано описание аргументов
В предыдущих разделах мы уже сталкивались с несколькими типами NOT NULL, и PRIMARY KEY, FOREING KEY. В данном разделе мы изучим практически еще несколько типов
Как мы видели выше, NOT NULL -ограничения — это NOT NULL, UNIQUE, CHECK.
| Ограничение | Описание | |
|---|---|---|
CHECK |
Гарантирует, что значения находятся в границах специфицированного интервала, задаваемого предикатом | |
| 2 | DEFAULT |
Помещает значение по умолчанию в колонку. Гарантирует, что колонка всегда имеет значение |
| 3 | FOREING KEY |
Гарантирует, что значения существуют как значения в колонке первичного ключа другой |
| 4 | NOT NULL |
Гарантирует, что колонка всегда содержит значение |
| 5 | PRIMARY KEY |
Гарантирует, что колонка всегда содержит значение и оно уникально в |
| 6 | UNIQUE |
Гарантирует, что значение будет уникальным в |
Использование NOT NULL и PRIMARY KEY было рассмотрено выше в настоящей лекции. Использование FOREING KEY будет рассмотрено при обсуждении создания
Ограничение CHECK позволяет выполнять проверку содержимого колонки относительно некоторых условий и списка значений. Она налагается с помощью предложения CHECK. Для добавления этого CHECK (предикат). Согласно требованиям стандарта с помощью ключевого слова VALUE в предикате вы ссылаетесь на значение колонки. Но практически во всех диалектах для этой цели используется имя колонки.
Опция DEFAULT заставляет СУБД размещать значение по умолчанию в колонке, когда кортеж вставляется в DEFAULT и после него указать любое значение, являющееся достоверным экземпляром типа данных колонки.
Ограничение UNIQUE гарантирует уникальность значения данных в колонке. Оно применяется, если нужно следить за тем, чтобы значения колонки, не являющейся первичным ключом, были уникальны в NULL.
Примеры использования
При решении задачи задания объектов БД для ХД проектировщик имеет на входе
Для всех суррогатных ключей uniqueidentifier. Задание такого типа колонки позволит увеличивать значение суррогатного ключа автоматически. Для этих столбцов используется функция NEWSEQUENTIALID() в DEFAULT для указания значений для новых строк. Также к столбцам типа uniqueidentifier применяется свойство ROWGUIDCOL, чтобы на столбец можно было ссылаться с помощью ключевого слова $ROWGUID, и
create table Customer (
Cust_ID uniqueidentifier
CONSTRAINT Guid_Default_1 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
FName varchar(20) not null,
LName varchar(20) not null,
Cust_Address varchar(40) null,
Company varchar(40) not null,
constraint PK_CUSTOMER primary key (Cust_ID)
)
go
Никаких дополнительных
create table Employee (
Empl_ID uniqueidentifier
CONSTRAINT Guid_Default_2 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Empl_FName varchar(20) not null,
Empl_LName varchar(20) not null,
City varchar(20) not null,
Empl_Address varchar(40) null,
constraint PK_EMPLOYEE primary key (Empl_ID)
)
go
Никаких дополнительных
create table Product (
Prod_ID uniqueidentifier
CONSTRAINT Guid_Default_3 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Name varchar(80) not null,
Size varchar(20) not null,
Unit_Price numeric(8,2) not null,
constraint PK_PRODUCT primary key (Prod_ID)
)
go
Наименование товара является уникальным значением, поэтому применим к этой колонке
Name varchar(80) not null UNIQUE NONCLUSTERED,
Цена товара является величиной положительной, поэтому целесообразно ввести проверку вводимого значения цены товара. Из анализа предметной области следует, что цена товаров, продаваемых компанией, находится в пределах от 15 руб. до 1500 руб. и можно ввести проверку этого значения на диапазон. Изменим строку, определяющую колонку "Цена товара" (Unit_Price), как показано ниже:
Unit_Price numeric(8,2) not null CHECK (Unit_Price >= 15 and Unit_Price <= 1500),
create table Time (
Time_ID uniqueidentifier
CONSTRAINT Guid_Default_4 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Year integer not null,
Quarter integer not null,
constraint PK_TIME primary key (Time_ID)
)
go
По решению руководства компании данные в ХД будут заноситься, начиная с 2007 года. Поэтому целесообразно ввести проверку на значения колонки "Год" (Year). Число кварталов в году – четыре. Введем проверку на значения колонки "Квартал" (Quarter). Строки стрипта, определяющие колонки "Год" (Year) и "Квартал" (Quarter), теперь выглядят, как показано ниже.
Year integer not null CHECK (Year >= 2007),
Quarter integer not null CONSTRAINT Q_CHK CHECK (Quarter IN ('1', '2', '3', '4''),
create table Sale (
Sale_ID uniqueidentifier
CONSTRAINT Guid_Default_5 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Time_ID uniqueidentifier null,
Cust_ID uniqueidentifier null,
Prod_ID uniqueidentifier null,
Empl_ID uniqueidentifier null,
Amount numeric(9,2) not null,
Quantity integer not null,
constraint PK_SALE primary key (Sale_ID)
)
go
Значения колонок "Количество" (Quantity) и "Сумма платежа" (Amount) не могут быть нулевыми. Поэтому наложим соответствующие
Amount numeric(9,2) not null CHECK (Amount >= 15), Quantity integer not null CHECK (Quantity >= 1),
Колонки "Идентификатор времени" (Time_ID), "Идентификатор покупателя" (Cust_ID_ "Идентификатор товара" (Prod_ID)) и "Идентификатор продавца" (Empl_ID) являются значениями первичных ключей
Заметим, что
Воспользуемся
ALTER TABLE table_name
{ [ ALTER COLUMN column_name
{DROP DEFAULT
| SET DEFAULT constant_expression
| IDENTITY [ ( seed , increment ) ]
}
| ADD
{ < column_definition > | < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column }
] }
< column_definition > ::=
{ column_name data_type }
[ [ DEFAULT constant_expression ]
| IDENTITY [ ( seed , increment ) ]
]
[ROWGUIDCOL]
[ < column_constraint > ] [ ...n ] ]
< column_constraint > ::=
[ NULL | NOT NULL ]
[ CONSTRAINT constraint_name ]
{
| { PRIMARY KEY | UNIQUE }
| REFERENCES ref_table [ (ref_column) ]
[ ON DELETE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
[ ON UPDATE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
}
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
{ ( column [ ,...n ] ) }
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES ref_table [ (ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
[ ON UPDATE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
}
Не будем приводить описания тех аргументов, которые присутствуют в команде
ALTER COLUMN. Указывает, что определенный столбец будет изменен или модифицирован.ADD. Указывает, что добавлено одно или несколько определений столбца или DROP { [CONSTRAINT] constraint_name| COLUMN column}. Указывает, что из constraint_name или column_name.Чтобы добавить
alter table Sale
add constraint FK_SALE_REFERENCE_TIME foreign key (Time_ID)
references Time (Time_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_CUSTOMER foreign key (Cust_ID)
references Customer (Cust_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_PRODUCT foreign key (Prod_ID)
references Product (Prod_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_EMPLOYEE foreign key (Empl_ID)
references Employee (Empl_ID)
go
Теперь проектировщик хранилища данных может перейти к созданию
Когда вы определяете PRIMARY KEY при создании <L (но не реляционной модели данных). Логически
Синтаксис
Create Relational Index
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
[ ; ]
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
}
<relational_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE}
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant ,…)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
{ IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Значения аргументов команды следующие.
UNIQUE. Создает уникальный Компонент не позволяет создать уникальный IGNORE_DUP_KEY присвоено значение ON. При попытке написания такого выдает сообщение об ошибке. Прежде чем создавать уникальный NOT NULL, т.к. при создании NULL рассматриваются как повторяющиеся.
CLUSTERED. Создает Если аргумент CLUSTERED не указан, создается некластеризованный
NONCLUSTERED. Создание index_name. Имя Column. Колонка или колонки, на которых основан table_or_view_name в порядке сортировки.В один
[ ASC | DESC ]. Определяет сортировку значений заданного столбца ASC.INCLUDE ( column [ ,... n ] ). Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного Имена столбцов в списке INCLUDE не могут повторяться и не могут использоваться одновременно как ключевые и неключевые.
WHERE <filter_predicate>. Создает отфильтрованный ON partition_scheme_name ( column_name ). Задает CREATE PARTITION SCHEME или ALTER PARTITION SCHEME. Аргумент column_name задает столбец, по которому будет секционирован partition_scheme_name.
Аргумент column_name может указывать на столбцы, не входящие в определение UNIQUE, когда столбец column_name должен быть выбран из используемых в уникальном ключе. Это Database Engine проверять уникальность значений ключа только в одной ON filegroup_name. Создает заданный ON "default". Создает заданный [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" }]. Указывает размещение данных FILESTREAM для FILESTREAM_ON позволяет перемещать данные FILESTREAM в другую файловую группу FILESTREAM или <object>::= Полное или неполное имя индексируемого объекта.database_name. Имя базы данных.schema_name. Имя table_or_view_name. Имя индексируемой <relational_index_option>::= Указывает параметры, которые должны использоваться при создании PAD_INDEX = { ON | OFF }. Определяет заполнение OFF.FILLFACTOR = fillfactor. Указывает, на сколько процентов должен компонент Database Engine заполнить страницы конечного уровня при создании или перестройке fillfactor должен быть целым числом от 1 до 100. Значение по умолчанию — 0. Если fillfactor равен 100 или 0, компонент Database Engine создает SORT_IN_TEMPDB = { ON | OFF }. Указывает, сохранять ли временные результаты сортировки в базе данных tempdb. Значение по умолчанию — OFF.IGNORE_DUP_KEY = { ON | OFF }. Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный STATISTICS_NORECOMPUTE = { ON | OFF }. Указывает, выполнялся ли перерасчет статистики распределения. Значение по умолчанию — OFF.DROP_EXISTING = { ON | OFF }. Указывает, что названный существующий кластеризованный или некластеризованный OFF.ONLINE = { ON | OFF }. Определяет, будут ли OFF.ALLOW_ROW_LOCKS = { ON | OFF }. Указывает, разрешена ли блокировка строк. Значение по умолчанию — ON.ALLOW_PAGE_LOCKS = { ON | OFF }. Указывает, разрешена ли блокировка страниц. Значение по умолчанию — ON.MAXDOP = max_degree_of_parallelism. Переопределяет параметр конфигурации максимальной степени параллелизма на время операций с MAXDOP можно применять для DATA_COMPRESSION. Задает режим сжатия данных для указанного NONE — PAGE — для ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ). Указывает DATA_COMPRESSION. Если ON PARTITIONS создаст ошибку. Если не указано предложение ON PARTITIONS, то параметр DATA_COMPRESSION применяется ко всем Предложение CREATE INDEX определяет имя ON определяет имя UNIQUE указывает, что индексируемые значения колонок должны быть уникальными для UNIQUE опциональна, и вы можете также создавать и неуникальные
Для диалекта SQL СУБД семейства MS SQL Server UNIQUE создаются автоматически. Поэтому проектировщику ХД нужно создать
Колонками – кандидатами для создания дополнительных
CREATE UNIQUE CLUSTERED INDEX Idx1 ON Product(Name); go CREATE UNIQUE CLUSTERED INDEX Idx2 ON Employee (Empl_LName); go
После выполнения вышеперечисленных действий задачу создания физической модели в первом приближении можно считать законченной. Теперь можно запустить разработанный скрипт для созданной БД и считать, что ХД создано.
В этой лекции мы рассмотрели принципы разработки физической модели ХД. Создание физической модели ХД состоит в моделировании и создании объектов для хранения данных в БД конкретной СУБД. Эта задача сводится к моделированию и созданию
ХД данных создается в реляционной БД. Физическая модель реляционной БД есть такое
Сначала создаются
Общий алгоритм построения физической модели ХД включает в себя следующие действия.
NOT NULL на значения колонок;Цель лекции
Изучив материал настоящей лекции, вы будете знать:
сможете:
и научитесь:
Литература: [2], [3], [37], [38].
В предыдущих лекциях мы изучали различные аспекты методов логического проектирования ХД. Методы логического проектирования основываются на абстрактном рассмотрении данных. Логическая модель никак не связана с конкретной реализацией модели в БД СУБД.
На практике ХД создаются и эксплуатируются как БД под управлением конкретной СУБД. БД, реализующие ХД, создаются на основе
Основными объектами логической модели данных являются сущности, атрибуты и взаимосвязи.
Далее, при изложении материала, мы будем предполагать, что имеем дело с реляционными или объектно-реляционными СУБД и соответствующими им диалектами SQL.
Можно выделить два этапа создания
На первом этапе в рамках требований реляционной модели создаются объекты хранения данных, соответствующие сущностям и взаимосвязям логической модели данных —
Главной целью второго этапа является обеспечение требуемого уровня производительности. Для достижения этой цели необходимо учитывать как особенности реализации СУБД, для которой создается физическая модель, так и особенности функционирования будущей информационной системы в целом. Обычно производительность БД измеряется в терминах производительности транзакций (transaction performance).
Для повышения
Одной из главных задач, которые обязан решить проектировщик на стадии проектирования физической модели ХД, является задача превращения объектов логической модели данных в объекты реляционной БД. Для решения этой задачи проектировщику необходимо знать: а) какими объектами располагает реляционная база данных в принципе; б) какие объекты поддерживает конкретная СУБД, которая выбрана для реализации базы данных.
Таким образом, мы предполагаем, что решение о выборе СУБД уже принято руководителем ИТ-проекта и согласовано с заказчиком базы данных, т.е. СУБД задана. Проектировщик ХД должен ознакомиться с документацией, в которой описан диалект SQL, поддерживаемый выбранной СУБД. В настоящей лекции предполагается, что была выбрана СУБД семейства MS SQL Server компании Microsoft, хотя подавляющая часть материала охватывает объекты в любой промышленной реляционной СУБД.
Иерархия объектов реляционной БД прописана в стандартах по SQL, в частности, в
(рис 11.1) Иерархия объектов реляционной базы данных, соответствующая стандарту SQL-92На самом нижнем уровне находятся объекты, с которыми работает реляционная БД, — столбцы (колонки) и строки. Они, в свою очередь, группируются в
Следует отметить, что ни одна из групп объектов стандарта SQL-92 не связана со структурами физического хранения информации в памяти компьютеров.
Помимо указанных на рисунке объектов в реляционной базе данных могут быть созданы
Под
Обычно процедура создания
Для проектировщика БД
Далее объекты БД будут определяться в контексте СУБД MS SQL Server 2005/2008. Такой подход принят потому, что проектирование физической модели БД выполняется для конкретной среды ее реализации.
На MS SQL Sever 2005
К числу основных объектов реляционных БД относятся
Для упрощения идентификации и именования объектов в базе данных поддерживаются такие объекты, как
Правила (Rules) – это декларативные выражения, ограничивающие возможные значения данных. Для формулировки правила используются допустимые предикатные выражения SQL.
Для обеспечения эффективного доступа к данным в реляционных СУБД поддерживается ряд других объектов:
Для обработки данных специальным образом или для реализации
Данные объекты реляционной базы данных представляют собой программы, т.е. исполняемый код. Этого код обычно называют серверным кодом (server-side code), поскольку он выполняется компьютером, на котором установлено ядро реляционной СУБД. Планирование и разработка такого кода является одной из задач проектировщика реляционной базы данных.
Функция (Function) — это объект базы данных, представляющий поименованный набор команд SQL и/или операторов специализированных языков обработки программирования базы данных, который при выполнении возвращает значение — результат вычислений.
Для эффективного управления разграничением доступа к данным поддерживается объект роль.
Роль (Role) – объект базы данных, представляющий собой поименованную совокупность привилегий, которые могут назначаться
В логической модели данных среда реализации не учитывается. В ней определяются атрибуты и их возможные значения, такие как строка, число или дата, в идеале атрибуту может назначаться домен. Домен — это просто тип атрибута, например, "Деньги" или "Рабочий день". Проектировщик может включить ряд проверок допустимости или правил обработки, например, требование, что значение должно быть положительным, ненулевым и иметь максимум два десятичных разряда (это полезно для вычисления сумм рублевых платежей, выставляемых банком на другой банк).
Использование доменов упрощает задачу обеспечения непротиворечивости на стадии логической модели данных. При переходе к проектированию
В контексте проектирования физической модели реляционной БД домен – это выражение, определяющее разрешенные значения для колонок (атрибутов) отношения. При описании
Пример 11.1. Колонку в базе данных можно описать следующим образом:
amount NUMBER (8,2) NOT NULL CONSTRAINT cc_limit_amnt CHECK (amount > 0)
В колонке "Сумма платежа" ( Amount ) можно размещать только числовые данные; точность этого значения — два значащих десятичных разряда ( NUMBER (8,2) ); она должна быть заполнена для каждой строки NOT NULL ); ее значение должно быть положительным CONSTRAINT cc_limit_amnt CHECK (amount > 0). Максимальное значение, которое может храниться в этом столбце, — 999999.99. В этом простом определении колонки мы фактически определили ряд неявных правил, проверку которых MS SQL Server принудительно включает при вводе данных в БД.
Как видно, дальнейшее определение домена колонки (после присвоения ей типа) выполняется проектировщиком с помощью уточнений правил изменения значений. Такие уточнения поддерживаются в SQL с помощью механизма
В
Тип данных — это спецификация, определяющая, какого рода данные могут храниться в объекте БД: целые числа, символы, данные
Все допустимые типы данных описаны в
Для всех типов данных определено так называемое нуль-значение, которое указывает на отсутствие данных в колонке указанного типа, т.е. то обстоятельство, что значение данных в текущий момент времени неизвестно.
Описание типов, данное в
MS SQL Server предоставляет набор системных типов данных, определяющих все типы данных, которые могут использоваться в нем. Можно также определять собственные типы данных в Transact-SQL или Microsoft .NET Framework. Псевдонимы типов данных основываются на системных типах. Пользовательские типы данных обладают свойствами, зависящими от методов и операторов класса, который создается для них на одном из языков программирования, поддерживающих .NET Framework.
При объединении одним оператором двух выражений с разными типами данных, параметрами сортировки, точностями, масштабами или длинами результат определяется следующим образом.
char, varchar, text, nchar, nvarchar или ntext.Типы данных в СУБД семейства MS SQL Server объединены в следующие категории:
| Тип данных | Синтаксис |
|---|---|
| Точные числа | |
bigint |
Целые значения в диапазоне от $$-2^{63}$$ до $$2^{63} - 1$$ |
int |
Целые значения в диапазоне от $$-2^{31}$$ до $$2^{31}-1$$ |
smallint |
Целые значения в диапазоне от $$-2^{15}$$ до $$2^{15)-1$$ |
tinyint |
Целые значения в диапазоне от 0 до 255 |
bit |
Целое число, равное 1, 0 или NULL |
decimal[ (p[ , s] )] и numeric[ (p[ , s] )] |
Числа с фиксированной точностью и масштабом. При использовании максимальной точности числа могут принимать значения в диапазоне от $$-10^{38}+1$$ до $$10^{38}-1$$.
|
money |
Денежные (валютные) значения в диапазоне от -922 337 203 685 477,5808 до 922 337 203 685 477,5807 |
smallmoney |
Денежные (валютные) значения в диапазоне от -214 748,3648 до 214 748,3647 |
| Приблизительные числа | |
float
|
Числовые значения с плавающей запятой в диапазонах: $$-1,79E^{308}$$ - $$-2,23E^{-308}$$ и $$2,23E^{-308}$$ - $$1,79E^{308}$$.
|
real |
Числовые значения с плавающей запятой в диапазонах: $$-3,40E^{38}$$ - $$-1,18E^{-38}$$ и $$1,18E^{-38}$$ - $$3,40E^{38}$$ |
| Дата и время | |
date |
Дата в формате ГГГГ-ММ-ДД. Диапазон значений от 0001-01-01 до 9999-12-31, от 1 января 1 года до 31 декабря 9999 года |
datetime |
Определяет дату, включающую время дня с долями секунды в 24-часовом формате, 1 января 1753 года - 31 декабря 9999 года, от 00:00:00 до 23:59:590,997 |
smalldatetime |
Определяет дату, сочетающуюся со временем дня. Время представлено в 24-часовом формате с секундами, всегда равными нулю (:00), без долей секунд, от 01.01.1900 до 06.06.2079, 1 января 1900 года - 6 июня 2079 года, от 00:00:00 до 23:59:59 |
time |
Определяет время дня. Время без учета часового пояса в 24-часовом формате, от 00:00:00.0000000 до 23:59:59.9999999 |
datetime2 |
Определяет дату, объединенную со временем дня в 24-часовом формате. От 0001-01-01 до 9999-12-31, с 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры, от 00:00:00 до 23:59:59.9999999 |
datetimeoffset |
Определяет дату, объединенную со временем дня, с учетом часового пояса в 24-часовом формате, от 0001-01-01 до 9999-12-31, с 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры, от 00:00:00 до 23:59:59.9999999 |
| Символьные строки | |
varchar [( n| max )] |
Символьные данные переменной длины, не в Юникоде. n может иметь значение от 1 до 8 000, max означает, что максимальный размер хранения равен $$2^{31}-1$$ байт. Размер хранения равен фактической длине данных плюс два байта. Введенные данные могут иметь длину 0 символов. varchar являются типы char или |
char [ ( n ) ] |
Символьные данные фиксированной длины, не в Юникоде, с длиной n байт. Значение n должно находиться в интервале от 1 до 8000. Размер хранения данных этого типа равен n байт. |
text |
Этот тип данных представляет данные, отличные от данных Юникод, с использованием кодовой страницы сервера. Максимальная длина данных - $$2^{31}$$ - 1 (2 147 483 647) символов. Если в кодовой странице сервера используются двухбайтовые символы, объем занимаемого типом пространства все равно не превышает 2 147 483 647 байт. Он может быть менее 2 147 483 647 байт - в зависимости от строки символов |
| Символьные строки в Юникоде | |
nchar [ ( n ) ] |
Символьные данные в Юникоде длиной в n символов. Аргумент n должен иметь значение от 1 до 4000. Размер хранилища вдвое больше n байт. nchar являются типы national char и |
nvarchar [(n|max )] |
Символьные данные в Юникоде переменной длины. Аргумент n может принимать значение от 1 до 4 000. Аргумент max указывает, что максимальный размер хранилища равен $$2^{31}-1$$ байт. Размер хранилища в байтах вдвое больше числа введенных символов + 2 байта. Введенные данные могут иметь длину в 0 символов. nvarchar являются типы national char и |
ntext |
Этот тип данных представляет символьные данные в Юникоде переменной длины, включающие до $$2^{30}$$ - 1 (1 073 741 823) символов. Объем занимаемого этим типом пространства (в байтах) в два раза превышает число символов. В спецификации SQL-2003 ntext является тип national text |
| Двоичные данные | |
binary [ ( n ) ] |
Двоичные данные фиксированной длины размером в n байт, где n - значение от 1 до 8000. Размер хранения составляет n байт |
varbinary [(n|max)] |
Двоичные данные переменной длины. n могут иметь значение от 1 до 8000; max означает максимальную длину хранения, которая составляет $$2^{31}-1$$ байт. Размер хранения - это фактическая длина введенных данных плюс 2 байта. Введенные данные могут иметь размер 0 символов. В SQL-2003 varbinary является binary |
image |
Этот тип представляет двоичные данные переменной длины, включающие от 0 до $$2^{31}$$ - 1 (2 147 483 647) байт |
| Прочие типы данных | |
timestamp |
Это тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Тип данных timestamp используется в основном в качестве механизма для отметки версий строк timestamp - всего лишь увеличивающееся значение, которое не сохраняет дату или время. Тип данных datetime используется для записи даты или времени |
xml ([CONTENT| DOCUMENT] xml_schema_collection ) |
Тип данных, в котором хранятся XML-данные. Можно хранить экземпляры xml в столбце либо в переменной типа xml.
|
sql_variant |
Столбец типа sql_variant может содержать строки различных типов данных. Например, столбец, определенный как sql_variant, может хранить значения int, binary и char |
table |
Особый тип данных, который можно использовать для хранения результирующего набора с целью последующей его обработки. Тип table применяется, главным образом, для временного хранения набора строк, возвращаемого в качестве результирующего набора возвращающей табличное значение функции |
cursor |
Тип данных для переменных или выходных параметров cursor, может принимать значение NULL |
Итак, мы рассмотрели основные объекты БД и допустимые типы данных, которыми располагает проектировщик ХД при использовании СУБД семейства MS SQL Server.
Далее поговорим об алгоритме создания физической модели ХД.
Рассмотрим в качестве примера логическую модель ХД типа "звезда" на рис 11.2 и построим на ее основе физическую модель ХД.
(рис 11.2) Логическая модель хранилища данныхЛогическая модель ХД, приведенная на рисунке, была разработана для анализа продаж компании в разрезах товаров, продавцов, покупателей, времени продаж. Она включает в себя четыре сущности для измерений: "Время" (Time), "Покупатель" (Customer), "Товар" (Product), "Продавец" (Employee) – и одну сущность для фактов "Продажи" (Sale).
Как видно из приведенной
Описание атрибутов модели приведено в табл. 11.2.
| Атрибут | Значение | Сущность |
|---|---|---|
Time_ID |
Идентификатор времени, ключ сущности | "Время" (Time) |
Year |
Год | "Время" (Time) |
Quarter |
Квартал года | "Время" (Time) |
Cust_ID |
Идентификатор покупателя, ключ сущности | "Покупатель" (Customer) |
FName |
Имя покупателя | "Покупатель" (Customer) |
LName |
Фамилия покупателя | "Покупатель" (Customer) |
Address |
Адрес покупателя | "Покупатель" (Customer) |
Company |
Место работы | "Покупатель" (Customer) |
Prod_ID |
Идентификатор товара, ключ сущности | "Товар" (Product) |
Name |
Наименование товара | "Товар" (Product) |
Size |
Габариты товара | "Товар" (Product) |
Unit_Price |
Цена за единицу товара | "Товар" (Product) |
Empl_ID |
Идентификатор продавца, ключ сущности | "Продавец" (Employee) |
Empl_FName |
Имя продавца | "Продавец" (Employee) |
Empl_LName |
Фамилия продавца | "Продавец" (Employee) |
City |
Населенный пункт | "Продавец" (Employee) |
Address |
Адрес месторасположения | "Продавец" (Employee) |
Sale_ID |
Идентификатор продаж, ключ сущности | "Продажи" (Sale) |
Amount |
Сумма платежа | "Продажи" (Sale) |
Quantity |
Количество | "Продажи" (Sale) |
После того как были рассмотрены документы, описывающие логическую модель ХД, задача проектировщика состоит в построении физической модели ХД, которая включает в себя следующие действия.
NOT NULL на значения колонок;Как указывалось выше, первый шаг в построении физической модели ХД есть идентификация
Для нашего учебного примера создадим пять
(рис 11.3) Создание таблиц физической модели хранилища данныхКогда проектировщик заканчивает обработку всех отношений логической модели данных, он должен еще раз проверить, соответствует ли число
Следующим шагом проектировщика ХД является определение колонок для
Сначала рассмотрим задачу добавления колонок. Колонка должна иметь имя. Имена атрибутов соответствующих отношений логической модели преобразуются в имена колонок в соответствии с правилами именования объектов, принятых в конкретной СУБД. Обычно, как указывалось выше, это SELECT.
(рис 11.4) Определение имен колонок таблиц физической модели хранилища данныхИмеется еще одна проблема в именовании колонок – имена колонок должны интерпретироваться
Для нашего учебного примера решение этой задачи сводится к перенесению атрибутов сущностей в поля соответствующих
Заметим, что для соблюдения принципа уникальности имен полей в рамках модели при определении полей на основе имен атрибутов сущностей мы изменили некоторые имена. Так, имя атрибута "Адрес" (Address) сущности "Продавцы" (Employee) в соответствующей
После идентификации колонок необходимо задать их тип в соответствии с допустимыми для данной СУБД типами данных. Эта задача упрощается, если в отношениях логической модели определены домены атрибутов. Некоторые из доменов могут быть определены уже в терминах СУБД. Для таких атрибутов практически ничего делать не нужно. Определение домена в терминах типа данных СУБД нужно просто перенести в DEC(9,2), а из контекста предметной области следует, что в этой колонке будет накапливаться итоговая сумма расходов за год, то, может быть, целесообразно определить тип как DEC(15,2), чтобы избежать возможного переполнения при работе приложений базы данных.
Если домен определен не в терминах СУБД, проектировщик базы данных должен преобразовать его в подходящий тип данных. При выполнении таких преобразований следует учитывать ряд факторов.
varchar(3), и она содержит код, значение которого изменяется в интервале от '10A' до '99Z', то целесообразно с точки зрения хранения изменить тип этой переменной на char(3). Это объясняется тем, что тип varchar при физическом хранении занимает на байт-два больше, чем тип char при одной и той же объявленной длине.DEC. Он обрабатывается процессором быстрее, чем тип FLOAT. Исключение составляют данные для научных расчетов, где INT и SMALLINT исключительно для счетчиков.CHAR для DATE и TIME только для хранения хронологических данных.DATETIME исключительно для целей управления данными.
(рис 11.5) Определение типов данных для колонок таблиц физической модели хранилища данныхВ нашем учебном примере для всех атрибутов задан домен. Для суррогатных первичных bigint, а для остальных атрибутов — тип данных integer. Домен "Текст" можно представить типом данных varchar(n), для numeric (p, s ).
Результат определения типов колонок
После определения всех колонок и их типов следует перейти к идентификации первичных ключей таблицы. Согласно требованиям реляционной теории каждая строка
Задание колонки как первичного ключа в контексте многих СУБД, в том числе и семейства MS SQL Server, считается
Для нашего примера мы уже определили первичные ключи
После выполнения вышеперечисленных действий задачу определения первичных ключей
При определении
Предопределенное значение колонки, равное NULL, означает, что в данный конкретный момент для данной конкретной строки (экземпляра сущности предметной области) значение не определено, или неизвестно, или отсутствует. Проектировщику базы данных необходимо идентифицировать возможность колонки принимать NULL-значения, т.к. у
Примером проблемы может служить ситуация, в которой
При назначении NULL-значений колонкам проектировщику необходимо принимать во внимание следующие факторы.
NOT NULL, т.к. согласно реляционной теории значения колонок первичного ключа должны быть определены и уникальны для каждого кортежа.NOT NULL, и поскольку SET NULL должны определяться со спецификацией NULL.NOT NULL WITH DEFAULT для колонок с типами данных DATE или TIME, чтобы сохранять текущие даты и текущее время автоматически.NOT NULL WITH DEFAULT для всех колонок, которые не подпадают под перечисленные выше правила.Для нашего учебного примера все колонки
(рис 11.6) Задание ограничений NOT NULL на значения колонок
Следующим шагом в моделировании физической модели ХД является установление взаимосвязи между
Таблица реляционной базы данных, содержащая первичный ключ, называется
Отношение "родитель-потомок" между
Отношения "родитель-потомок" между двумя
Установив связь "родитель-потомок" между
(рис 11.7) Задание ограничений NOT NULL на значения колонокВопрос, который необходимо решить при моделировании ХД, состоит в том, будут ли внешние ключи измерений элементами составного первичного ключа
В нашем примере Sale_ID ), поэтому внешние ключи, реализующие отношение "родитель-потомок" между
После создания физической модели ХД проектировщик ХД может перейти к решению задачи разработки скрипта для создания ХД. Эта задача может быть решена и вручную, как мы сделаем это в следующем разделе настоящей лекции, и при помощи CASE-средств.
Для определения и создания
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { <column_definition> | <computed_column_definition>
| <column_set_definition> }
[ <table_constraint> ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name | filegroup
| "default" } ]
[ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
[ SPARSE ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( < index_option > [ , ...n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
[
WITH FILLFACTOR = fillfactor
|WITH ( <index_option> [ , ...n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<table_option> ::=
{
DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF}
| ALLOW_PAGE_LOCKS ={ ON | OFF}
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Рассмотрим элементы и аргументы команды CREATE TАBLE.
database_name. Имя БД, в которой создается database_name должно быть указано имя существующей БД. Если аргумент database_name не указан, по умолчанию database_name, и этот CREATE TABLE.schema_name. Имя table_name. Имя новой table_name может состоять не более чем из 128 символов, за исключением имен локальных временных column_name. Имя столбца в column_name может содержать от 1 до 128 символов. При создании столбцов с типом данных timestamp аргумент column_name может быть пропущен. Если аргумент column_name не указан, столбцу типа timestamp по умолчанию присваивается имя timestamp.computed_column_expression. Выражение, определяющее значение вычисляемого столбца. Вычисляемый столбец представляет собой виртуальный столбец, физически не хранящийся в PERSISTED. Значение столбца вычисляется на основе выражения, использующего другие столбцы той же cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, функцией, переменной или любой их комбинацией, соединенной одним или несколькими операторами. Выражение не может быть вложенным запросом или содержать типы данных "псевдонимы".Вычисляемые столбцы могут использоваться в списках выборки, предложениях WHERE, ORDER BY и в любых других местах, в которых могут применяться обычные выражения, за исключением следующих случаев.
DEFAULT или FOREIGN KEY, ни вместе с определением NOT NULL. Однако вычисляемый столбец может использоваться в качестве ключевого столбца PRIMARY KEY или UNIQUE, если значение этого вычисляемого столбца определяется детерминистическим выражением и тип данных результата разрешен в столбцах a и b, вычисляемый столбец a+b может быть включен в a+DATEPART(dd, GETDATE()) — не может, так как его значение может изменяться при последующих вызовах.INSERT или UPDATE.PERSISTED. Указывает, что SQL Server PERSISTED для вычисляемого столбца позволяет создать PERSISTED. Если указан признак PERSISTED, аргумент computed_column_expression должно быть детерминистическим.ON { <partition_scheme> | filegroup | "default" }. Указывает <partition_scheme> указан, <partition_scheme>. Если указан аргумент filegroup, "default", или параметр ON не определен вообще, CREATE TABLE, изменить в дальнейшем невозможно.Параметр ON {<partition_scheme> | filegroup | "default"} может также указываться в PRIMARY KEY или UNIQUE. С помощью этих filegroup, "default" или параметр ON не определен вообще, PRIMARY KEY или UNIQUE создает кластеризованный CLUSTERED или другим способом), то указанный аргумент <partition_scheme> отличается от аргументов <partition_scheme> и filegroup из определения
TEXTIMAGE_ON { filegroup | "default" }. Ключевые слова, указывающие, что столбцы типов text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max), а также пользовательских типов среды CLR хранятся в определенной файловой группе.Параметр TEXTIMAGE_ON недопустим, если в TEXTIMAGE_ON одновременно с параметром <partition_scheme>. Если указано значение "default" или параметр TEXTIMAGE_ON не определен вообще, столбцы с большими значениями сохраняются в установленной по умолчанию файловой группе. Способ хранения любых данных столбцов с большими значениями, определенный инструкцией CREATE TABLE, изменить в дальнейшем невозможно.
FILESTREAM_ON { partition_scheme_name | filegroup | "default" }. Задает файловую группу для данных FILESTREAM.Если FILESTREAM и является секционированной, необходимо включить предложение FILESTREAM_ON и указать
Если FILESTREAM не может быть секционирован. Данные FILESTREAM для FILESTREAM_ON.
Если FILESTREAM_ON не указано, используется файловая группа FILESTREAM, для которой задано свойство DEFAULT. При отсутствии файловой группы FILESTREAM возникает ошибка.
Как и в случае с предложениями ON и TEXTIMAGE_ON, значение, указанное с помощью инструкции CREATE TABLE для предложения FILESTREAM_ON, не может быть изменено, за исключением следующих ситуаций.
CREATE INDEX преобразует кучу в кластеризованный FILESTREAM, NULL.DROP INDEX преобразует кластеризованный FILESTREAM, "default".[ type_schema_name. ] type_name. Указывает Тип данных может быть одним из следующих.
CREATE TYPE . Состояние признака NULL или NOT NULL для типа данных – псевдонима может быть переопределено с помощью инструкции CREATE TABLE. Однако его длину изменить нельзя; длина типа данных – псевдонима не определяется инструкцией CREATE TABLE.CREATE TYPE . Для создания столбца с пользовательским типом среды CLR требуется разрешение REFERENCES на этот тип.precision. Точность указанного типа данных.Scale. Масштаб указанного типа данных.Max. Применяется только к типам данных varchar, nvarchar и varbinary для хранения $$2^{31}$$ байт символьных и двоичных данных или 2^30 байт данных в Юникоде.CONTENT. Указывает, что каждый экземпляр типа данных xml в столбце column_name может содержать несколько элементов верхнего уровня. Аргумент CONTENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection. Если этот параметр не указан, CONTENT принимается в качестве поведения по умолчанию.DOCUMENT. Указывает, что каждый экземпляр типа данных xml в столбце column_name может содержать только один элемент верхнего уровня. Аргумент DOCUMENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection.xml_schema_collection.. Применим только к типу данных xml для коллекции XML- CREATE XML SCHEMA COLLECTION.DEFAULT. Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY. Если значение по умолчанию указывается для столбца определяемого constant_expression в определяемый DEFAULT удаляются, когда NULL. Для совместимости с более ранними версиями SQL Server параметру DEFAULT может быть присвоено имя constant_expression. Константа, значение NULL или системная функция, используемая в качестве значения столбца по умолчанию.IDENTITY. Указывает, что новый столбец является столбцом идентификаторов. При добавлении в Database Engine формирует для этого столбца уникальное последовательное значение. Столбцы идентификаторов обычно используются с PRIMARY KEY для поддержания уникальности идентификаторов строк в IDENTITY может быть назначено столбцам типов tinyint, smallint, int, bigint, decimal(p,0) или numeric(p,0). Для каждой DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указать как начальное значение, так и приращение, или же не указывать ничего. Если ни одно из значений не указано, то действительно значение по умолчанию — (1,1).Seed. Значение, используемое для самой первой строки, загружаемой в Increment. Значение приращения, добавляемое к значению идентификатора предыдущей загруженной строки.NOT FOR REPLICATION. В инструкции CREATE TABLE предложение NOT FOR REPLICATION может указываться для свойства IDENTITY, а также FOREIGN KEY и CHECK. Если это предложение указано для свойства IDENTITY, значения в столбцах идентификаторов не приращиваются, когда вставку выполняют агенты репликации. Если ROWGUIDCOL. Указывает, что новый столбец является столбцом идентификаторов GUID. В качестве столбца ROWGUIDCOL можно назначить только один столбец uniqueidentifier в ROWGUIDCOL позволяет ссылаться на столбец с помощью ключевого слова $ROWGUID. Свойство ROWGUIDCOL можно присвоить только столбцу, имеющему тип uniqueidentifier. Ключевое слово ROWGUIDCOL недопустимо, если уровень совместимости базы данных равен 65 или ниже. Ключевым словом ROWGUIDCOL нельзя обозначать столбцы пользовательских типов данных.Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце. Кроме того, при указании данного свойства автоматическое формирование значений для новых строк, вставляемых в INSERT функции NEWID или NEWSEQUENTIALID либо использовать эти функции по умолчанию для столбца.
SPARSE . Указывает, что столбец является разреженным столбцом. Хранилище разреженных столбцов оптимизируется для значений NULL. Для разреженных столбцов нельзя указать параметр NOT NULL.FILESTREAM. Допустимо только для столбцов типа varbinary(max). Указывает хранилище FILESTREAM для данных BLOB типа varbinary(max).uniqueidentifier с атрибутом ROWGUIDCOL. Этот столбец не должен допускать значений NULL и должен иметь UNIQUE или PRIMARY KEY. Значение идентификатора GUID для столбца должно быть предоставлено приложением во время вставки данных или DEFAULT, в котором используется функция NEWID ().
Столбец ROWGUIDCOL нельзя удалить и связанные FILESTREAM. Столбец ROWGUIDCOL можно удалить только после удаления последнего столбца FILESTREAM.
Если для столбца указан атрибут хранилища FILESTREAM, то все значения для этого столбца хранятся в контейнере данных FILESTREAM в файловой системе.
COLLATE collation_name. Задает параметры сортировки для столбца. Имя параметров сортировки может быть либо именем параметров сортировки Windows, либо именем параметров сортировки SQL. Аргумент collation_name применим только к столбцам типов данных char, varchar, text, nchar, nvarchar и ntext. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки пользовательского типа (если столбец принадлежит к пользовательскому типу данных), либо установленные по умолчанию параметры сортировки для базы данных.CONSTRAINT. Необязательное ключевое слово, указывающее на начало определения PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY или CHECK.constraint_name. Имя NULL | NOT NULL. Определяет, допустимы ли для столбца значения NULL. Параметр NULL не является NOT NULL. NOT NULL может быть указано для вычисляемых столбцов только в случае если одновременно указан параметр PERSISTED.PRIMARY KEY. PRIMARY KEY для UNIQUE. UNIQUE.CLUSTERED | NONCLUSTERED. Указывает, что для PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный PRIMARY KEY по умолчанию создается кластеризованный CLUSTERED ), а для UNIQUE — некластеризованный ( NONCLUSTERED ).В инструкции CREATE TABLE параметр CLUSTERED можно задать только для одного UNIQUE указан параметр CLUSTERED и, кроме того, указано PRIMARY KEY, то для PRIMARY KEY применяется по умолчанию значение NONCLUSTERED.
FOREIGN KEY REFERENCES. FOREIGN KEY требуют, чтобы каждое значение в столбце существовало в соответствующем связанном столбце или столбцах в связанной FOREIGN KEY могут ссылаться только на столбцы, являющиеся PRIMARY KEY или UNIQUE в связанной UNIQUE INDEX связанной PERSISTED.[ schema_name . ] referenced_table_name ]. Имя FOREIGN KEY, и ( ref_column [ ,... n ] ). Столбец или список столбцов из FOREIGN KEY.ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }. Определяет операцию, которая производится над строками создаваемой NO ACTION.NO ACTION. Компонент Database Engine инициирует ошибку, и производится откат операции удаления строки CASCADE. Если из SET NULL . Все значения, составляющие внешний ключ, при удалении соответствующей строки NULL. Для выполнения этого NULL.SET DEFAULT . Все значения, составляющие внешний ключ, при удалении соответствующей строки NULL и множество значений по умолчанию не задано явно, NULL становится неявным значением по умолчанию для данного столбца.ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }. Указывает, какое действие совершается над строками в изменяемой NO ACTION.NO ACTION. Компонент Database Engine возвращает ошибку, и обновление строки CASCADE. Соответствующие строки обновляются в ссылающейся SET NULL . Всем значениям, составляющим внешний ключ, присваивается значение NULL, когда обновляется соответствующая строка в NULL.SET DEFAULT . Всем значениям, составляющим внешний ключ, присваивается их значение по умолчанию, когда обновляется соответствующая строка в NULL и множество значений по умолчанию не задано явно, NULL становится неявным значением по умолчанию для данного столбца.CHECK. CHECK в вычисляемых столбцах должны быть также помечены как PERSISTED.logical_expression. Логическое выражение, возвращающее значения TRUE или FALSE. Типы данных "псевдонимы" частью выражения быть не могут.Column. Столбец или список столбцов (в скобках), который применяется в [ ASC | DESC ]. Указывает порядок сортировки столбца или столбцов, участвующих в ASC — по возрастанию, DESC — по убыванию. Значение по умолчанию — ASC.partition_scheme_name. Имя [ partition_column_name. ]. Указывает столбец, по которому будет секционирована partition_scheme_name. Вычисляемый столбец, участвующий в PERSISTED.WITH FILLFACTOR = fillfactor. Указывает, насколько плотно компонент Database Engine должен заполнять каждую страницу fillfactor могут находиться в диапазоне от 1 до 100. Если значение не задано, по умолчанию оно принимается равным 0. Значения фактора заполнения 0 и 100 во всех отношениях считаются равнозначными.column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS. Имя набора столбцов. Набор столбцов представляет собой нетипизированное XML-представление, в котором все разреженные столбцы < table_option> ::= Указывает один или более параметров DATA_COMPRESSION. Задает режим сжатия данных для указанной NONE. ROW. PAGE. ON PARTITIONS ( { <выражение_номера_секции> | <диапазон> } [ ,...n ] ). Указывает DATA_COMPRESSION. Если ON PARTITIONS приведет к формированию ошибки. Если не указано предложение ON PARTITIONS, параметр DATA_COMPRESSION применяется ко всем <Выражение_номера_секции> можно указать одним из следующих способов:
ON PARTITIONS (2) ;ON PARTITIONS (1, 5) ;ON PARTITIONS (2, 4, 6 TO 8).<Диапазон> можно указать номерами TO, например: ON PARTITIONS (6 TO 8).
Чтобы для разных DATA_COMPRESSION несколько раз:
<index_option> ::= Указывает один или более параметров PAD_INDEX = { ON | OFF }. Если указано значение ON, процент свободного места, определяемый параметром FILLFACTOR, применяется к страницам OFF или значение FILLFACTOR не указано, страницы промежуточного уровня заполняются до приблизительного объема, оставляющего достаточно места, как минимум, для одной строки максимального размера, которого может достигать OFF.FILLFACTOR = fillfactor. Указывает процентное соотношение, определяющее, насколько заполненным компонент Database Engine должен делать конечный уровень каждой страницы fillfactor должен быть целым числом в диапазоне от 1 до 100. Значение по умолчанию равно 0. Значения фактора заполнения 0 и 100 во всех отношениях считаются равнозначными.IGNORE_DUP_KEY = { ON | OFF }. Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения CREATE INDEX, ALTER INDEX или UPDATE. Значение по умолчанию — OFF.ON. Если в уникальный OFF. Если в уникальный INSERT.IGNORE_DUP_KEY. Нельзя установить в значение ON для STATISTICS_NORECOMPUTE = { ON | OFF }. Если указано значение ON, автоматический пересчет устаревших статистик OFF, включается автоматическое обновление статистик. Значение по умолчанию — OFF.ALLOW_ROW_LOCKS = { ON | OFF }. Если указано значение ON, при доступе к Database Engine . При значении OFF блокировки строк не используются. Значение по умолчанию — ON.ALLOW_PAGE_LOCKS = { ON | OFF }. Если указано значение ON, при доступе к Database Engine . При значении OFF блокировки страниц не используются. Значение по умолчанию — ON.Выше было дано описание аргументов
В предыдущих разделах мы уже сталкивались с несколькими типами NOT NULL, и PRIMARY KEY, FOREING KEY. В данном разделе мы изучим практически еще несколько типов
Как мы видели выше, NOT NULL -ограничения — это NOT NULL, UNIQUE, CHECK.
| Ограничение | Описание | |
|---|---|---|
CHECK |
Гарантирует, что значения находятся в границах специфицированного интервала, задаваемого предикатом | |
| 2 | DEFAULT |
Помещает значение по умолчанию в колонку. Гарантирует, что колонка всегда имеет значение |
| 3 | FOREING KEY |
Гарантирует, что значения существуют как значения в колонке первичного ключа другой |
| 4 | NOT NULL |
Гарантирует, что колонка всегда содержит значение |
| 5 | PRIMARY KEY |
Гарантирует, что колонка всегда содержит значение и оно уникально в |
| 6 | UNIQUE |
Гарантирует, что значение будет уникальным в |
Использование NOT NULL и PRIMARY KEY было рассмотрено выше в настоящей лекции. Использование FOREING KEY будет рассмотрено при обсуждении создания
Ограничение CHECK позволяет выполнять проверку содержимого колонки относительно некоторых условий и списка значений. Она налагается с помощью предложения CHECK. Для добавления этого CHECK (предикат). Согласно требованиям стандарта с помощью ключевого слова VALUE в предикате вы ссылаетесь на значение колонки. Но практически во всех диалектах для этой цели используется имя колонки.
Опция DEFAULT заставляет СУБД размещать значение по умолчанию в колонке, когда кортеж вставляется в DEFAULT и после него указать любое значение, являющееся достоверным экземпляром типа данных колонки.
Ограничение UNIQUE гарантирует уникальность значения данных в колонке. Оно применяется, если нужно следить за тем, чтобы значения колонки, не являющейся первичным ключом, были уникальны в NULL.
Примеры использования
При решении задачи задания объектов БД для ХД проектировщик имеет на входе
Для всех суррогатных ключей uniqueidentifier. Задание такого типа колонки позволит увеличивать значение суррогатного ключа автоматически. Для этих столбцов используется функция NEWSEQUENTIALID() в DEFAULT для указания значений для новых строк. Также к столбцам типа uniqueidentifier применяется свойство ROWGUIDCOL, чтобы на столбец можно было ссылаться с помощью ключевого слова $ROWGUID, и
create table Customer (
Cust_ID uniqueidentifier
CONSTRAINT Guid_Default_1 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
FName varchar(20) not null,
LName varchar(20) not null,
Cust_Address varchar(40) null,
Company varchar(40) not null,
constraint PK_CUSTOMER primary key (Cust_ID)
)
go
Никаких дополнительных
create table Employee (
Empl_ID uniqueidentifier
CONSTRAINT Guid_Default_2 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Empl_FName varchar(20) not null,
Empl_LName varchar(20) not null,
City varchar(20) not null,
Empl_Address varchar(40) null,
constraint PK_EMPLOYEE primary key (Empl_ID)
)
go
Никаких дополнительных
create table Product (
Prod_ID uniqueidentifier
CONSTRAINT Guid_Default_3 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Name varchar(80) not null,
Size varchar(20) not null,
Unit_Price numeric(8,2) not null,
constraint PK_PRODUCT primary key (Prod_ID)
)
go
Наименование товара является уникальным значением, поэтому применим к этой колонке
Name varchar(80) not null UNIQUE NONCLUSTERED,
Цена товара является величиной положительной, поэтому целесообразно ввести проверку вводимого значения цены товара. Из анализа предметной области следует, что цена товаров, продаваемых компанией, находится в пределах от 15 руб. до 1500 руб. и можно ввести проверку этого значения на диапазон. Изменим строку, определяющую колонку "Цена товара" (Unit_Price), как показано ниже:
Unit_Price numeric(8,2) not null CHECK (Unit_Price >= 15 and Unit_Price <= 1500),
create table Time (
Time_ID uniqueidentifier
CONSTRAINT Guid_Default_4 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Year integer not null,
Quarter integer not null,
constraint PK_TIME primary key (Time_ID)
)
go
По решению руководства компании данные в ХД будут заноситься, начиная с 2007 года. Поэтому целесообразно ввести проверку на значения колонки "Год" (Year). Число кварталов в году – четыре. Введем проверку на значения колонки "Квартал" (Quarter). Строки стрипта, определяющие колонки "Год" (Year) и "Квартал" (Quarter), теперь выглядят, как показано ниже.
Year integer not null CHECK (Year >= 2007),
Quarter integer not null CONSTRAINT Q_CHK CHECK (Quarter IN ('1', '2', '3', '4''),
create table Sale (
Sale_ID uniqueidentifier
CONSTRAINT Guid_Default_5 DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Time_ID uniqueidentifier null,
Cust_ID uniqueidentifier null,
Prod_ID uniqueidentifier null,
Empl_ID uniqueidentifier null,
Amount numeric(9,2) not null,
Quantity integer not null,
constraint PK_SALE primary key (Sale_ID)
)
go
Значения колонок "Количество" (Quantity) и "Сумма платежа" (Amount) не могут быть нулевыми. Поэтому наложим соответствующие
Amount numeric(9,2) not null CHECK (Amount >= 15), Quantity integer not null CHECK (Quantity >= 1),
Колонки "Идентификатор времени" (Time_ID), "Идентификатор покупателя" (Cust_ID_ "Идентификатор товара" (Prod_ID)) и "Идентификатор продавца" (Empl_ID) являются значениями первичных ключей
Заметим, что
Воспользуемся
ALTER TABLE table_name
{ [ ALTER COLUMN column_name
{DROP DEFAULT
| SET DEFAULT constant_expression
| IDENTITY [ ( seed , increment ) ]
}
| ADD
{ < column_definition > | < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column }
] }
< column_definition > ::=
{ column_name data_type }
[ [ DEFAULT constant_expression ]
| IDENTITY [ ( seed , increment ) ]
]
[ROWGUIDCOL]
[ < column_constraint > ] [ ...n ] ]
< column_constraint > ::=
[ NULL | NOT NULL ]
[ CONSTRAINT constraint_name ]
{
| { PRIMARY KEY | UNIQUE }
| REFERENCES ref_table [ (ref_column) ]
[ ON DELETE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
[ ON UPDATE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
}
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
{ ( column [ ,...n ] ) }
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES ref_table [ (ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
[ ON UPDATE { CASCADE | NO ACTION | SET DEFAULT |SET NULL } ]
}
Не будем приводить описания тех аргументов, которые присутствуют в команде
ALTER COLUMN. Указывает, что определенный столбец будет изменен или модифицирован.ADD. Указывает, что добавлено одно или несколько определений столбца или DROP { [CONSTRAINT] constraint_name| COLUMN column}. Указывает, что из constraint_name или column_name.Чтобы добавить
alter table Sale
add constraint FK_SALE_REFERENCE_TIME foreign key (Time_ID)
references Time (Time_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_CUSTOMER foreign key (Cust_ID)
references Customer (Cust_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_PRODUCT foreign key (Prod_ID)
references Product (Prod_ID)
go
alter table Sale
add constraint FK_SALE_REFERENCE_EMPLOYEE foreign key (Empl_ID)
references Employee (Empl_ID)
go
Теперь проектировщик хранилища данных может перейти к созданию
Когда вы определяете PRIMARY KEY при создании <L (но не реляционной модели данных). Логически
Синтаксис
Create Relational Index
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
[ ; ]
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
}
<relational_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE}
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant ,…)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
{ IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Значения аргументов команды следующие.
UNIQUE. Создает уникальный Компонент не позволяет создать уникальный IGNORE_DUP_KEY присвоено значение ON. При попытке написания такого выдает сообщение об ошибке. Прежде чем создавать уникальный NOT NULL, т.к. при создании NULL рассматриваются как повторяющиеся.
CLUSTERED. Создает Если аргумент CLUSTERED не указан, создается некластеризованный
NONCLUSTERED. Создание index_name. Имя Column. Колонка или колонки, на которых основан table_or_view_name в порядке сортировки.В один
[ ASC | DESC ]. Определяет сортировку значений заданного столбца ASC.INCLUDE ( column [ ,... n ] ). Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного Имена столбцов в списке INCLUDE не могут повторяться и не могут использоваться одновременно как ключевые и неключевые.
WHERE <filter_predicate>. Создает отфильтрованный ON partition_scheme_name ( column_name ). Задает CREATE PARTITION SCHEME или ALTER PARTITION SCHEME. Аргумент column_name задает столбец, по которому будет секционирован partition_scheme_name.
Аргумент column_name может указывать на столбцы, не входящие в определение UNIQUE, когда столбец column_name должен быть выбран из используемых в уникальном ключе. Это Database Engine проверять уникальность значений ключа только в одной ON filegroup_name. Создает заданный ON "default". Создает заданный [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" }]. Указывает размещение данных FILESTREAM для FILESTREAM_ON позволяет перемещать данные FILESTREAM в другую файловую группу FILESTREAM или <object>::= Полное или неполное имя индексируемого объекта.database_name. Имя базы данных.schema_name. Имя table_or_view_name. Имя индексируемой <relational_index_option>::= Указывает параметры, которые должны использоваться при создании PAD_INDEX = { ON | OFF }. Определяет заполнение OFF.FILLFACTOR = fillfactor. Указывает, на сколько процентов должен компонент Database Engine заполнить страницы конечного уровня при создании или перестройке fillfactor должен быть целым числом от 1 до 100. Значение по умолчанию — 0. Если fillfactor равен 100 или 0, компонент Database Engine создает SORT_IN_TEMPDB = { ON | OFF }. Указывает, сохранять ли временные результаты сортировки в базе данных tempdb. Значение по умолчанию — OFF.IGNORE_DUP_KEY = { ON | OFF }. Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный STATISTICS_NORECOMPUTE = { ON | OFF }. Указывает, выполнялся ли перерасчет статистики распределения. Значение по умолчанию — OFF.DROP_EXISTING = { ON | OFF }. Указывает, что названный существующий кластеризованный или некластеризованный OFF.ONLINE = { ON | OFF }. Определяет, будут ли OFF.ALLOW_ROW_LOCKS = { ON | OFF }. Указывает, разрешена ли блокировка строк. Значение по умолчанию — ON.ALLOW_PAGE_LOCKS = { ON | OFF }. Указывает, разрешена ли блокировка страниц. Значение по умолчанию — ON.MAXDOP = max_degree_of_parallelism. Переопределяет параметр конфигурации максимальной степени параллелизма на время операций с MAXDOP можно применять для DATA_COMPRESSION. Задает режим сжатия данных для указанного NONE — PAGE — для ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ). Указывает DATA_COMPRESSION. Если ON PARTITIONS создаст ошибку. Если не указано предложение ON PARTITIONS, то параметр DATA_COMPRESSION применяется ко всем Предложение CREATE INDEX определяет имя ON определяет имя UNIQUE указывает, что индексируемые значения колонок должны быть уникальными для UNIQUE опциональна, и вы можете также создавать и неуникальные
Для диалекта SQL СУБД семейства MS SQL Server UNIQUE создаются автоматически. Поэтому проектировщику ХД нужно создать
Колонками – кандидатами для создания дополнительных
CREATE UNIQUE CLUSTERED INDEX Idx1 ON Product(Name); go CREATE UNIQUE CLUSTERED INDEX Idx2 ON Employee (Empl_LName); go
После выполнения вышеперечисленных действий задачу создания физической модели в первом приближении можно считать законченной. Теперь можно запустить разработанный скрипт для созданной БД и считать, что ХД создано.
В этой лекции мы рассмотрели принципы разработки физической модели ХД. Создание физической модели ХД состоит в моделировании и создании объектов для хранения данных в БД конкретной СУБД. Эта задача сводится к моделированию и созданию
ХД данных создается в реляционной БД. Физическая модель реляционной БД есть такое
Сначала создаются
Общий алгоритм построения физической модели ХД включает в себя следующие действия.
NOT NULL на значения колонок;Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.