Опубликован: 02.08.2007 | Уровень: специалист | Доступ: платный
Лекция 9:

Создание объектов для хранения данных. Работа с ограничениями

Добавление колонок в таблицы

Следующим шагом проектировщика базы данных является определение колонок для базовых таблиц. Колонки таблицы должны представлять атрибуты отношений логической модели реляционной базы данных. Эти атрибуты необходимо преобразовать в спецификации колонок в команде CREATE TABLE. Спецификация колонки таблицы имеет следующий синтаксис: имя колонки, тип данных для значений, сохраняемых в колонке, список ограничений.

Сначала рассмотрим задачу добавления колонок. Колонка должна иметь имя. Имена атрибутов соответствующих отношений логической модели преобразуются в имена колонок в соответствии с правилами именования объектов, принятых в конкретной СУБД. Обычно, как указывалось выше, это ограничение на длину имени и использование в имени специальных символов. Например, в некоторых СУБД допускается использовать знак доллара в имени, однако этот знак обычно не распознается в командах выборки данных - SELECT.

Имеется еще одна проблема в именовании колонок: имена колонок должны интерпретироваться пользователем однозначно. Например, если проектировщик базы данных назначит для фамилии сотрудника короткое имя LN, то, наверное, потребуется комментарий, в котором необходимо указать, что это фамилия, а не линия (например, линия производства). Если невозможно по каким-то причинам применять длинные имена полей, то следует использовать словарь данных для интерпретации введенных аббревиатур.

При назначении имен колонок проектировщик базы данных продолжает формировать стандартный список имен колонок и их сокращений в словаре данных. Он также должен выполнить проверку списка имен в словаре данных, чтобы избежать конфликтов имен в базе данных в целом.

Пример. Продолжим работу с учебным примером. После именования колонок получим следующее:

CREATE TABLE DEPARTAMENT 
(
	DEPNO,  имя колонки
	DNAME,
	LOC,
	MANAGER,
	PHONE,
);

CREATE TABLE EMPLOYEE 
(
	EMPNO,
	ENAME,
	LNAME,
	DEPNO,
	SSECNO,
	PROJNO,
	JOB,
	AGE,
	HIREDATE,
	SAL,
	COMM,
	FINE,
);
CREATE TABLE PROJECT 
(
	PROJNO,
	PNAME,
	BUDGET,
);

Определение типов данных для колонок

После идентификации колонок необходимо задать их тип в соответствии с допустимыми для данной СУБД типами данных. Эта задача упрощается, если в отношениях логической модели определены домены атрибутов. Некоторые из доменов могут быть определены уже в терминах СУБД. Для таких атрибутов практически ничего делать не нужно. Определение домена в терминах типа данных СУБД нужно просто перенести в спецификацию колонки. Возможно, проектировщику будет нужно уточнить второстепенные параметры типа. Например, если задан домен как DEC (9,2), а из контекста предметной области следует, что в этой колонке будет накапливаться итоговая сумма расходов за год, то может быть целесообразным определить тип как DEC (15,2), чтобы избежать возможного переполнения при работе приложений базы данных.

Если домен определен не в терминах СУБД, проектировщик базы данных должен преобразовать его в подходящий тип данных. При выполнении таких преобразования следует учитывать ряд факторов.

  • Следует уточнить, как СУБД физически хранит данные того или иного предопределенного типа, и затем уточнить интервалы изменения значений колонок. Например, если тип переменной - varchar (3), которая содержит код, чье значение изменяется в интервале от '10A' ' до '99Z', то целесообразно с точки зрения хранения изменить тип этой переменной на char (3). Это объясняется тем, что тип varchar при физическом хранении занимает на байт-два больше, чем тип char при одной и той же объявленной длине.
  • Для числовых значений фиксированной длины предпочтительнее использовать тип DEC. Он обрабатывается процессором быстрее, чем тип FLOAT. Исключение составляют данные для научных расчетов, где представление чисел в экспоненциальной форме бывает необходимо.
  • Используйте INT и SMALLINT исключительно для счетчиков.
  • Старайтесь избегать использования LONG VARCHAR без лишней надобности. Обычно колонки такого типа хранятся на отдельном экстенте жесткого диска, причем не в той области диска, где хранятся остальные данные таблицы.
  • Избегайте использовать тип CHAR для представления числовых данных. Во-первых, может потребоваться дополнительная проверка, а во-вторых, могут возникнуть проблемы при сортировке таких колонок, поскольку число, заданное строкой '11', будет находиться выше, чем число, заданное строкой '9', при упорядочивании по возрастанию.
  • Используйте типы DATE и TIME только для хранения хронологических данных.
  • Используйте тип DATETIME исключительно для целей управления данными.

Пример. Продолжим изучение нашего примера. После определения типов колонок наши команды для создания таблиц будут выглядеть следующим образом:

CREATE TABLE DEPARTAMENT 
( 
	DEPNO 	integer,  имя колонки, тип, длина
	DNAME 	char(20),
	LOC 		char(20),
	MANAGER 	char(20),
	PHONE 	char(15),
);

CREATE  TABLE EMPLOYEE
(
	EMPNO  	integer,
	ENAME  	char(25),
	LNAME  	char(10),
	DEPNO  	int,
	SSECNO  	char(10),
	PROJNO  	char(8),
	JOB  		char(25),
	AGE  		date,
	HIREDATE 	date,
	SAL  		dec(9,2),
	COMM  	dec(9,2),
	FINE 		dec(9,2),
);

CREATE TABLE PROJECT 
(
	PROJNO  	char(8),
	PNAME  	char(25),
	BUDGET  	dec(9,2),
);
Александра Каева
Александра Каева
Михаил Забелкин
Михаил Забелкин
Виктория Бычкова
Виктория Бычкова
Россия, Ленинград, Ленинградская лесотехническая академия, 1988
Ivan Klepcsov
Ivan Klepcsov
Россия