Гудков А.В., Гудков К.С.

Государственный научно-исследовательский институт авиационных систем (ФГУП "ГосНИИАС")

Сравнительный анализ систем управления базами данных с точки зрения поддержки ограничений (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.