Intelligent Enterprise

Volume 1, Number 1, October 1998

The Birth of the Relational Model

C.J. Date

Оригинал статьи можно найти по адресу www.intelligententerprise.com/feat4.html

Воспоминания об исходных статьях Кодда и размышления об эволюции реляционной модели в сегодняшних лидирующих системах баз данных.

It was thirty years ago today / Dr. Edgar showed the world the way ...
- с извинениями перед Ленноном и МакКартни

Прошу прощения за поэтическое заимствование, но около тридцати лет тому назад доктор Эдгар Ф. Кодд (Edgar F. Codd) начал работать над тем, что стало Реляционной Моделью Данных. В 1969 г. он опубликовал первую статью в блестящей серии оригинальных статей, описывающих эту работу - статей, которые сделали мир таким, как мы его знаем. Конечно, за это время многие люди внесли свой вклад (иногда весьма значительный) в исследования баз данных вообще и исследования реляционных баз данных в частности; однако ни одна из этих последовавших работ не была настолько существенна или фундаментальна, как исходная работа Кодда. Я уверен, что и через сотни лет системы баз данных будут основываться на реляционном фундаменте Кодда.

Две первые статьи

Как я уже отметил, первая статья Кодда "Derivability, Redundency, and Consistency of Relations Stored in Large Data Banks" была опубликована в 1969 г. К сожалению, эта статья являлась исследовательским отчетом IBM; поэтому к ней применялось Limited Distribution Notice, и ее не смогло увидеть столько людей, сколько должно было увидеть. (И правда, статья стала чем-то вроде предмета для коллекционирования.) Но на следующий год пересмотренный вариант этой первой статьи был напечатан в Communications of the ACM, и эта статья была гораздо более широко распространенной и получила гораздо большее внимание (по крайней мере, в академических кругах). Действительно, обычно считается, что эта версия 1970 г. "A Relational Model of Data for Large Shared Data Banks" положила начало всему направлению, хотя, возможно, это немного несправедливо по отношению к предшествовавшей статье. Эти две первые статьи Кодда являются необычными в одном отношении: они читаются и перечитываются спустя почти тридцать лет после публикации! Про сколько статей можно сказать то же самое? В то же время, необходимо сказать, что эти статьи не очень-то легко читать. Статьи изложены кратко и немного сухо, стиль изложения теоретический и академический, обозначения и примеры приводятся в математической манере. Я уверен, что буду прав, если скажу, что к сегодняшнему дню только незначительная часть профессионалов в области баз данных действительно читала эти статьи. Поэтому я подумал, что было бы интересно и полезно посвятить короткую серию статей тщательному и беспристрастному ретроспективному обзору и оценке первых двух статей Кодда.

Однако, когда я начал писать этот обзор, я пришел к выводу, что было бы лучше не ограничивать себя только первыми двумя статьями, а взглянуть на все ранние публикации Кодда, посвященные реляционным базам данных. В следующие несколько месяцев я планирую рассмотреть, кроме уже упомянутых, следующие важные статьи Кодда: "Relational Completeness of Data Base Sublanguages", "A Data Base Sublanguage Founded on the Relational Calculus", "Further Normalization of the Data Base Relational Model", "Interactive Support for Nonprogrammers: The Relational and Network Approaches" и "Extending the Relational Database Model to Capture More Meaning". Одно предварительное замечание. Я не собираюсь утверждать, что ранние статьи Кодда были абсолютно правильными вплоть до последней детали или что сам Кодд предвидел все последствия своих идей. Было бы удивительно, если бы все было именно так. Наличие небольших ошибок и некоторой степени путаницы является нормальным и естественным, когда крупное изобретение впервые видит свет; подумайте о телефоне, автомобиле или телевидении (или даже о самих компьютерах; вы помните предсказание, что трех компьютеров хватит, чтобы удовлетворить все вычислительные потребности Соединенных Штатов?). Как бы то ни было, в дальнейшем изложении я, конечно, буду применять принцип "уравновешенного взгляда в прошлое" ("20/20 hindsight"). Я действительно думаю, что интересно посмотреть, как развивались во времени некоторые аспекты реляционной модели.

Фундаментальный вклад Кодда

Для обеспечения возможности ссылок позвольте привести здесь краткий обзор основных результатов Кодда. (Я ограничиваюсь только тем, что касается реляционного подхода! Не так широко известен тот факт, что получили признание оригинальные работы Кодда в еще, по крайней мере, двух областях -- а именно, мультипрограммирование и обработка естественных языков. Однако, детали этих других работ выходят за рамки этой статьи.) Вероятно, наибольшим достижением Кодда было то, что ему удалось превратить управление базами данных в науку; он заложил надежный научный фундамент этой области, обеспечив теоретический базис (реляционную модель!), на основе которого к решению множества важных проблем можно было приступать в научном стиле. Другими словами, реляционная модель реально является базисом теории данных. На самом деле, термин "реляционная теория" в некоторых случаях более предпочтителен, чем термин "реляционная модель", и было бы лучше, если бы Кодд использовал именно этот термин. Но он этого не сделал.

Таким образом Кодд привнес в область баз данных желанную и очень потребную ноту ясности и строгости. Более точно, он ввел не только конкретную реляционную модель, но идею моделей данных вообще. Он подчеркивал важность различия (к прискорбию, до сих пор многими не понятого) между моделью и реализацией. Он обнаружил потенциал в использовании идей логики предикатов как основы управления базами данных и определил реляционную алгебру и реляционное исчисление как базисные средства работы с данными в реляционной форме. В дополнение к этому, он определил (неформально) то, что, вероятно, было первым реляционным языком, - "Data Sublanguage ALPHA"; ввел понятие функциональной зависимости и определил три первые нормальные формы (1NF, 2NF, 3NF); определил ключевое понятие существенности.

Статья 1969-го года

Теперь я хочу сосредоточиться на статье 1969-го года (хотя буду также упоминать некоторые моменты, где размышления в статье 1970-го года развивают или заменяют то, что содержалось в версии 1969-го года). Статья 1969-го года -- которая, чтобы напомнить, называлась "Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks" -- состояла из введения и следующих шести разделов:

  1. Реляционное представление данных
  2. Некоторые лингвистические аспекты
  3. Операции над отношениями
  4. Выражаемые, Именованные и Хранимые отношения
  5. Порождаемость, Избыточность и Согласованность
  6. Управление Банком Данных.

Заслуживает внимание основная направленность статьи. Как показывают название и анотация, основное внимание уделяется не столько реляционной модели как таковой, сколько обеспечению средств исследования в точной и научной манере, надежным понятиям избыточности и согласованности данных. В самом деле, термин "реляционная модель" вообще не появляется в статье, хотя во введении действительно говорится о "реляционном представлении ... (или модели) данных". Во введении также указывается, что реляционное "представление" обладает некоторыми преимуществами по сравнению с "популярной графовой (или сетевой) моделью. Оно обеспечивает средства описания данных исключительно в терминах их естественной структуры (т.е. исключаются все детали, относящиеся к машинному представлению); оно также обеспечивает основу для конструирования высокоуровневого языка выборки с максимальной [sic] независимостью данных" (т.е. независимостью между прикладной программой и машинным представлением данных - тем, что теперь мы более точно называем физической независимостью данных). Обратите, кстати, внимание на термин "язык выборки"; в статье 1970-го года он был заменен на термин "язык данных", но в первых двух статьях упор делался на запросы, а не на операции обновления. В добавок к этому, реляционное представление позволяет ясно оценить возможности и ограничения существующих систем баз данных, равно как и сравнительные качества "конкурирующих представлений данных в пределах одной системы". (Другими словами, оно обеспечивает основу для решения проблемы логического проектирования баз данных.) Заметим, что впоследствии это привело ко многим интересным разработкам.

Реляционное представление данных

По-существу, этот раздел статьи Кодда посвящен тому, что позже стали называть структурной частью реляционной модели; т.е. в нем обсуждаются отношения как таковые (и кратко упоминаются ключи), но вообще не рассматриваются реляционные операции (то, что позже стали называть манипуляционной частью модели). Краткого рассмотрения заслуживает приведенное в статье определение отношения. Определение выглядит примерно так: "Для данных множеств S1, S2, ..., Sn (не обязательно различных) R является отношением над этими множества, если является множество n-арных кортежей, первый элемент каждого из которых принадлежит S1, второй - S2 и т.д. Мы будем называть Sj j-м доменом R ... Будем говорить, что R имеет степень n." (И в статье 1970-го года добавлено: "Более точно, R является подмножеством декартова произведения своих доменов.")

Являясь приемлемым с математической точки зрения, это определение может быть подвергнуто критики с точки зрения баз данных -- здесь вступает в действие уравновешенный взгляд в прошлое! -- в нескольких отношениях. Во-первых, не проводится ясное различение между доменами, с одной стороны, и атрибутами или столбцами, с другой стороны. Правда, в статье позже вводится термин "атрибут", но отсутствуют его формальное определение и согласованное использование. (В статье 1970-го года вводится термин "активный домен" для обозначения множества значений данного домена, действительно появляющихся в базе данных в любой заданный момент времени, но и это понятие не является тем же самым, что понятие атрибута.) В результате, в индустрии существовала большая путаница вокруг различий доменов и атрибутов, и эта путаница сохраняется и по сей день. (Для справедливости я должен добавить, что в первой редакции моей книги "An Introduction to Database Systems", Addison-Wesley, 1975 различие между доменами и атрибутами тоже было не слишком ясным.)

Далее в статье 1969-го года приводится пример, который -- по крайней мере, на интуитивном уровне -- наталкивается на эту путаницу. В примере используется отношение PART с двумя (помимо других) столбцами QUANTITY_ON_HAND и QUANTITY_ON_ORDER. Кажется очевидным, что эти два столбца должны были бы определены на одном и том же домене, но пример ясно говорит - нет. (Автор относится к ним как к разным доменам, а потом говорит, что эти домены "соответствуют тому, что обычно называют ... атрибутами".)

Заметим также, что определение отношения указывает, что домены (а следовательно, и атрибуты) отношения упорядочены слева направо. Правда, в статье 1970-го года говорится, что пользователи должны иметь дело не с "отношениями с упорядоченными доменами", а с "их двойниками без упорядоченности доменов" (которые в статье называются связями - relationship), но это уточнение, по всей видимости, не привлекло внимание некоторых членов сообщества баз данных -- включая, очень неформально, разработчиков языка SQL, в котором столбцы таблицы явно упорядочены слева направо.

Затем Кодд переходит к определению "банка данных" (который мы теперь, конечно, обычно называем базой данных) как "коллекции изменяемых во времени отношений ... разной степени" и устанавливает, что "каждое [такое] отношение может быть предметом занесения дополнительных кортежей степени n, удаления существующих кортежей и изменения компонентов любого из его существующих кортежей степени n". Здесь, к сожалению, мы с треском попадаем в историческую путаницу между значениями отношений и переменными отношений. В математике (и в собственном определении Кодда) отношение - это просто значение, и нет никакого способа изменять его во времени; отсутствует такая вещь как "отношение, изменяемое во времени". Но, конечно, мы можем иметь переменные -- т.е переменные отношений -- значениями которых являются отношения (разные значения в разные моменты времени), и в действительности это то, что Кодд называет "отношениями, изменяемыми во времени".

Неудача в четком различении этих двух разных понятий была еще одним источником последующей путаницы. По этой причине я предпочел бы далее в этой серии заметок проводить обсуждение явно в терминах значений отношений и переменных отношений, а не использовать только термин "отношение" -- изменяемое и не изменяемое во времени. Однако, к сожалению, для этого потребовалось бы слишком много переписать и (что хуже) реструктуризовать в материале из статей Кодда, который мне нужно цитировать и исследовать, поэтому я с неохотой отказался от этой идеи. Я серьезно надеюсь, что это решение не приведет к еще большей путанице.

Вернемся к статье 1969-го года. Следующая вводимая концепция является критической -- конечно, очень хорошо знакомой теперь -- это концепция ключа (в смысле уникального идентификатора). Ключ называется неизбыточным, если каждый содержащийся в нем атрибут является необходимым для целей уникальной идентификации; т.е. при удалении любого атрибута оставшиеся не смогут больше служить уникальным идентификатором. (Здесь под термином "ключ" понимается то, что мы теперь называем суперключом, а термин "неизбыточный ключ" соответствует тому, что мы теперь называем возможным ключом -- возможные ключи "неизбыточны" или несократимы по определению.)

Между прочим, в статье 1970-го года термин "первичный ключ" используется вместо просто "ключа". Поэтому обратите внимание, что "первичный ключ" в статье 1970-го года используется не в том смысле, в каком обычно понимается сегодня, потому что:

  1. он не обязан быть неизбыточным и
  2. у одного отношения может иметься произвольное число первичных ключей. Однако затем в статье говорится, что если у данного отношения имеется "два или более неизбыточных первичных ключа, то произвольно выбирается один из них и называется первичным ключом".

В статье 1970-го года также вводится термин "внешний ключ". (На самом деле, и в статье 1969-го года содержится краткое упоминание об этой концепции, но сам термин не используется.) Однако определение является слишком ограничительным в том смысле, что -- по какой-то причине -- не допускает использования в качестве внешнего ключа первичного ключа (или возможного ключа? или суперключа?). В реляционной модели в ее сегодняшнем понимании такое ограничение отсутствует.

На этом выделенный мне на этот месяц объем исчерпывается. Я заложил некоторую основу для того, что будет дальше, но вклад Кодда настолько значителен и многообразен, что для меня нет никакой возможности адекватно отразить его в одной или двух статьях. Видимо, это будет достаточно долгое путешествие.