Гудков А.В., Гудков К.С.
Государственный
научно-исследовательский институт авиационных систем (ФГУП
"ГосНИИАС")
Сравнительный
анализ систем управления базами данных с точки зрения поддержки ограничений
(constraints)
Ограничения – это специальные правила, которые не позволяют недопустимой информации попасть в таблицы базы данных. Они могут быть реализованы либо как свойства поля, либо как одноимённые объекты базы данных – constraints. Существуют также свойства полей, которые не являются ограничениями, но для которых существуют объекты constraints. Цель данной статьи – провести сравнительный анализ использования объектов constraints для различных реляционных СУБД. В приведённой ниже таблице приведены поддерживаемые ограничения для различных СУБД.
|
СУБД |
Ограничения |
|
Microsoft
SQL Server |
PRIMARY
KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT |
|
SAP
SQL Anywhere |
PRIMARY
KEY, FOREIGN KEY, UNIQUE, CHECK (уровня столбца), CHECK (уровня таблицы). |
|
SAP
Adaptive Server Enterprise |
PRIMARY
KEY, FOREIGN KEY, UNIQUE, CHECK (уровня столбца), CHECK (уровня таблицы),
DEFAULT |
|
Oracle
Database |
PRIMARY
KEY, FOREIGN KEY, UNIQUE, CHECK. |
|
IBM
Informix |
PRIMARY
KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL |
|
IBM
DB2 |
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK |
|
Interbase |
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT
NULL |
|
Firebird |
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT
NULL |
|
PostgreSQL |
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK,
EXCLUDE |
|
MySQL |
PRIMARY KEY, FOREIGN KEY, UNIQUE |
Свойство полей DEFAULT – это значение по умолчанию для выбранного поля. Из 10 рассмотренных СУБД только две создают для значения по умолчанию объект constraint: Microsoft SQL Server и SAP Adaptive Server Enterprise. Изменение значения по умолчанию различается в различных СУБД с точки зрения синтаксиса (TName – имя таблицы, CName – имя столбца, CnstName – имя ограничения):
|
СУБД |
Ограничения |
|
Microsoft
SQL Server |
alter table TName
add constraint CnstName default 10 for CName |
|
SAP
SQL Anywhere |
alter table TName
modify CName default 10 |
|
SAP
Adaptive Server Enterprise |
alter table TName
replace CName default 10 |
|
Oracle
Database |
alter table TName modify CName
default 10 |
|
IBM
Informix |
alter table TName
modify (CName int default 10) |
|
IBM
DB2 |
alter table TName alter
column CName set default 10 |
|
Interbase |
Добавление значения по умолчанию к существующему столбцу не поддерживается. |
|
Firebird |
alter table TName alter column CName set default 10 |
|
PostgreSQL |
alter table TName alter column CName set default 10 |
|
MySQL |
alter table TName modify column CName int default 10 |
Ограничение NOT NULL запрещает добавление в столбец NULL-значений. Это ограничение существует во всех десяти рассматриваемых СУБД, но имеет различия в реализации. СУБД Microsoft SQL Server, SAP SQL Anywhere, SAP Adaptive Server Enterprise, IBM DB2 и MySQL рассматривают данные ограничения как свойства полей и не создают для них объекты-ограничения constraints. СУБД IBM Informix, Interbase и Firebird создают специальные объекты-ограничения constraints. СУБД Oracle Database и PostgreSQL считают ограничение NOT NULL разновидностью ограничения CHECK и создают соответствующие объекты-ограничения constraints.
СУБД Microsoft SQL Server, SAP SQL Anywhere, SAP Adaptive Server Enterprise, ORACLE Database, IBM Informix, IBM DB2, PostgreSQL и MySQL допускают использование ключевого слова NULL, чтобы показать отсутствие ограничения NOT NULL. СУБД Interbase и Firebird не допускают использование ключевого слова NULL, чтобы показать отсутствие ограничения NOT NULL.
Проверочные ограничения CHECK служат для проверки выполнения условий, накладываемых на отдельный столбец или всю таблицу в целом. Из рассматриваемых СУБД только MySQL не поддерживает CHECK constraints. Инструкции по их созданию синтаксически допустимы, но в дальнейшем игнорируются. В СУБД SAP SQL Anywhere и SAP Adaptive Server Enterprise для проверочных ограничений уровня столбца и уровня таблицы создаются разные виды constraints. В остальных СУБД для проверочных ограничений уровня столбца и уровня таблицы создаётся один и тот же вид ограничений. Обобщённые ограничения CHECK, условия которых могут затрагивать несколько таблиц, называются ограничениями общего вида (assertions) и с трудом поддаются эффективной реализации [1].
В соответствии со стандартом ограничения UNIQUE могут как разрешать включение полей, которые допускают значения NULL (опциональное свойство), так и не разрешать их включение [2]. Выбор осуществляется производителями СУБД. Если ограничения UNIQUE допускают значения NULL, то совпадения в NULL-значениях не должно приводить к совпадению строк. Например, если ограничение UNIQUE наложено на один столбец, то допустимо любое число NULL-значений. Ограничение уникальности UNIQUE поддерживается во всех десяти рассматриваемых СУБД, но имеет ряд особенностей реализации. В СУБД Microsoft SQL Server, SAP Adaptive Server Enterprise и IBM Informix ограничение UNIQUE, наложенное на один столбец, допускает присутствие в нём ровно одного значения NULL. Аналогично, результаты не соответствуют стандарту и для случая ограничения UNIQUE на несколько столбцов. СУБД SAP SQL Anywhere, IBM DB2 и Interbase разрешают накладывать ограничение UNIQUE только на NOT NULL столбцы, то есть не реализуют необязательную часть стандарта SQL. Если в СУБД ORACLE Database используется ограничение UNIQUE на нескольких столбцах, то повтор всех значений (включая отдельные NULL-значения) запрещён, если не все значения одновременно являются NULL. То есть СУБД ORACLE Database соответствует стандарту только для ограничений UNIQUE на один столбец. Остальные СУБД из рассматриваемого списка (Firebird, PostgreSQL и MySQL) реализованы в соответствии со стандартом.
СУБД PostgreSQL поддерживает специальный вид ограничений EXCLUDE, который представляет собой обобщение стандартного ограничения уникальности UNIQUE. Этот вид ограничений позволяет задать несколько видов сравнений и гарантирует, что ни для каких двух строк они все не вернут true одновременно.
Первичные ключи (PRIMARY KEY) поддерживаются во всех перечисленных СУБД.
Внешние ключи (FOREIGN KEY) и ссылочная целостность поддерживаются во всех перечисленных СУБД. Единственная особенность связана с СУБД MySQL, для которой поддержка внешних ключей зависит от используемого для хранения таблиц движка (storage engine). Например, InnoDB поддерживает внешние ключи, а MyISAM не поддерживает.
В работе был проведён сравнительный анализ десяти популярных систем управления базами данных с точки зрения поддержки ограничений (constraints). В результате было показано, что даже для самых распространённых ограничений существуют различия реализации как между собой, так и со стандартом.
Литература:
1) Гарсиа-Молина Г., Ульман Д., Уидом Д. Системы баз данных. Полный курс. – М.: Вильямс, 2003. – 1088 с.
2) ISO/IEC
9075-2:1999, Database Language SQL – Part 2: Foundation (SQL/Foundation) –
1999.