Рецензии

Владимир Пржиялковский

Крис Дейт. Введение в базы данных. Шестое издание. Киев, Диалектика, 1998.

Киевское издательство “Диалектика” сделало большой подарок разработчикам БД, выпустив эту книгу. От прочей литературы по базам данных она отличается неповторимым своеобразием. Между первым ее американским изданием (1975 г.) и шестым (1995 г.) лежит, как легко заметить, 20 лет. Начало этого периода приходится на бурное становление дисциплины “базы данных” в целом и реляционной технологии баз данных в частности, а конец - на активное обсуждение перспективности реляционного подхода и предлагаемых к нему дополнений и альтернатив. Таким образом, речь идет о книге-эпохе. На ней выросло не одно поколение зарубежных специалистов, и о ней с теплотой вспоминают все, даже первопроходцы и пропагандисты таких непохожих на описанные Дейтом технологии современных областей, как склады данных и OLAP. Книга входит в золотой фонд литературы по информатике и по своей значимости попадает в один ряд с “Искусством программирования” Кнута, “Конструированием компиляторов” Ахо и Ульмана и немногими другими.    

 

Несколько слов об авторе

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

Десятилетиями занимаясь реляционным подходом, Крис Дейт был и остается одним из немногих специалистов, наиболее глубоко понимающих его содержание, мотивировки и проблемы. Своеобразие ситуации в том, что мнения двух классиков - вроде Маркса и Энгельса реляционного подхода - на создаваемую технологию в свое время по ряду вопросов разошлись. При этом у Дейта сформировался критический взгляд на то, как реляционную технологию воплощают производители СУБД. Находясь в своего рода оппозиции меньшинства, определяемого как “пуристы реляционного подхода”, Дейт тем не менее последовательно и продуманно защищает свое мнение, привлекая симпатии многих разработчиков. Надо сказать, что его точка зрения часто оказывается шире реляционности и применима к теории баз данных вообще.

В сравнении с некоторыми современными авторами, выпускающими по нескольку книг в год, Дейт неплодовит, однако каждое его публичное выступление, письменное или устное, привлекает пристальное внимание специалистов.    

 

Теперь о книге

Книга состоит из шести частей: “Основные понятия”, “Реляционная модель”, “Проектирование базы данных”, “Защита данных”, “Дополнительные аспекты”, “Объектно-ориентированные системы”.

Читатель, знакомый с советским переводом, заметит, что в шестом издании исчезли части, посвященные нереляционным моделям данных (иерархической и сетевой) и сравнению моделей, но зато добавились отдельные части по объектному подходу и по проектированию БД. Остальные части книги подверглись перегруппировке и существенной переработке. Шестое издание, как замечает сам автор, это “новая книга” по отношению к изданию 1975 года.

Первая часть - “Основные понятия” - по существу осталась прежней. В ней последовательно рассматриваются три темы: управление базами данных (что такое база данных и система управления базами данных); архитектура системы баз данных; введение в реляционные базы данных. Здесь очень важен порядок изложения - от общего к частному - и существенно, что понятие реляционной БД замыкает эту часть книги, а не открывает ее рассуждением, к примеру, о том, как ловко можно создавать и изменять таблички. Реляционные системы здесь выглядят не неким самодостаточным явлением, обязанным своим существованием счастливому изобретению, а выражением идей и подходов, формировавшихся на протяжении десятилетия. Это важно по двум причинам. Во-первых, в отвлеченном формальном изложении реляционного подхода, с которым нередко имеют дело практикующие программисты (еще не худший вариант!) исчезает смысл и мотивировка понятий, составляющих методологическую основу применения подхода. Программист, осознающий используемую реляционную систему шире, чем просто систему для работы с табличками, и знакомый с такими принципами, как централизованный подход к управлению данными, разделение данных и прикладных программ, трехуровневая архитектура системы баз данных (внешний уровень, концептуальный и внутренний) и другими, предшествующими в этой части книги изложению реляционного подхода, скорее всего будет применять свою СУБД более адекватно. Ну а во-вторых, автор правильно расставляет акценты, показывая, что реляционный подход - это только одно из воплощений более общих идей, и оставляя, по крайней мере теоретически, свободу для творчества.

Вторая часть, в которой излагаются понятия реляционной модели, очень конкретна и формальна. Это - конек Дейта, здесь он не превзойден почти никем в мире. Здесь “поставщики”, “детали” и “города” базы данных - наглядного пособия Дейта в книге - служат для объяснения таких фундаментальных для реляционной модели понятий, как домены, отношения, целостность объектов и ссылок. В этой части говорится о реляционных операторах (в контексте реляционной алгебры и реляционного исчисления) и о языке SQL, ставшем де-факто принадлежностью реляционного подхода. Ее теоретичность может отпугнуть “закоренелого практика” (разве что кроме главы про SQL). Тем не менее это очень важная часть книги (и даже очень увлекательная). Мне, например, не раз приходилось сталкиваться с программистами, тратящими впустую свое (а значит, не только свое) время на поиск SQL-выражения для принципиально не формулируемого в этом языке запроса.

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

В части “Проектирование баз данных” речь идет о логическом проектировании БД, иначе говоря, о том, как для имеющегося в прикладной области набора данных выбрать подходящую логическую структуру и решить, какие следует задать базовые отношения и с какими атрибутами. Физическое проектирование (проектирование схемы конкретной СУБД) в книге не затрагивается, что, конечно, не противоречит общей позиции рассматривать максимально приближенные к конкретным, но все еще общие решения. Дейт замечает, что логическое проектирование - скорее искусство, чем наука, и упоминает о существующем в реальной практике обратном влиянии физической модели данных на логическую. И все же определенный научный подход к логическому проектированию имеется, и он необходим. Можно, например, заметить, что SQL-запрос к ненормализованной БД не обязан давать содержательно правильный ответ (синтаксически этот запрос может быть вполне корректным). Итак, предметами рассмотрения этой части являются две вещи: нормализация (в контексте функциональной зависимости) и проектирование “сущность - связь”. Если второе многим отечественным разработчикам знакомо по CASE-системам, которыми они пользуются в повседневной практике, то о функциональных зависимостях следует упомянуть отдельно. В реальной жизни многие разработчики эту возможность проектирования просто себе не представляют, разве что иногда они руководствуются простым житейским правилом, что “атрибуты в таблице не должны зависеть друг от друга, а лишь от ключа”. Между тем, как пишет Дейт, понятие функциональных зависимостей “обеспечивает основу для научного подхода к решению нескольких практических задач, поскольку обладает богатым набором интересных формальных свойств, позволяющих формально и строго решить многие проблемы”. Может быть, с помощью книги читатель вспомнит (или откроет для себя впервые), что такое та или иная нормальная форма и как знание это применительно к своему конкретному приложению способно помочь спроектировать БД. Опять-таки немаловажно, что, хотя материал в этой части книги излагается относительно реляционной системы, он применим и к другим моделям данных.

В четвертой части автор от модельных качеств СУБД возвращается к эксплуатационным, рассматривая средства защиты множества данных в БД от преднамеренно созданных или случайных угрожающих ситуаций в условиях одновременной работы с базой многих пользователей. Речь идет о таких функциях СУБД, как восстановление, параллелизм, защита и целостность. Обсуждается очень широкий круг вопросов, включая схемы организации и механизмы выполнения транзакций (некоторым программистам, полагающим, что система сама разберется, как обработать запросы правильно, не мешало бы, например, увидеть на примере, как при обработке “правильно” составленных транзакций могут возникнуть ситуации, приводящие к неправильному результату), методы блокировки, избирательное и обязательное управление доступом, шифрование, декларативные ограничения целостности (сохранение корректности данных), ограничения состояния и перехода и др. Интересно, как Дейт “справился” с “противоречием” понятия избыточности данных в СУБД: на первых же страницах книги он объявляет, что одна из целей СУБД состоит в устранении избыточности данных, но в то же время единственным способом обеспечить восстановление данных (а это функция СУБД) является обеспечение в той или иной форме избыточности. Оказывается, все просто: избыточность устраняется на логическом уровне, а организуется - на физическом.

В число “дополнительных аспектов” в пятой части книги попали некоторые концепции и возможности, которые, по мнению Дейта, должны быть употребимы разработчиками при использовании реляционной технологии, описанной в предшествующих частях (главным образом во второй). Можно заметить, что другие специалисты включают некоторые из этих “аспектов” в саму реляционную технологию. Но так или иначе, автор здесь говорит о следующих вещах: о представлениях (view); об оптимизации (составляющей, по выражению Дейта, для реляционных систем как проблему, так и возможность повышения производительности); о комплексе вопросов, связанных с доменами, отношениями и типами данных; о работе с отсутствующей информацией; о распределенной БД и об архитектуре клиент-сервер.

Наконец, в последней части Дейт предлагает свое видение объектно-ориентированного (объектного) подхода к базам данных, а также дает критический анализ основных концепций объектных баз данных и сравнительную характеристику объектной и реляционной технологий в области БД. Он отмечает, что “в отличие от реляционной технологии здесь [в объектной] не существует общепринятой, абстрактной и формально определенной объектной модели данных” и что словосочетание “объектно-ориентированный” скорее просто является “удобным ярлыком для целой совокупности некоторых взаимосвязанных идей”. Тем не менее он как математик (или, по крайней мере, формалист) честно пытается изучить эти “объектные идеи” и высказывает при этом свои соображения, не всегда совпадающие с мнением других специалистов.

Кроме того, книга включает приложение с описанием целого ряда разноплановых явлений, которые связаны с базами данных и интересны сами по себе.    

 

По поводу изложения материала

Что касается изложения книги, то тут у меня есть два интересных наблюдения. Во-первых, Дейт хотя и классик, но отнюдь не конформист. По отдельным вопросам он может расходиться во взглядах с такими специалистами, как Кодд (например, точка зрения на отсутствующие значения) или Стоунбрейкер (объектно-реляционный подход), однако в книге эти расхождения не выливаются в “фундаментализм”. Дейта отличает терпимый, можно даже сказать, деликатный подход к изложению материала. Например, являясь противником реализации SQL как языка работы с реляционными СУБД, он целую главу посвятил SQL-2. Часто, изложив чужую точку зрения на тот или иной материал, он отсылает за своей в список рекомендуемой литературы!

Второе наблюдение касается педагогического характера книги. Книга написана в стиле учебника, хотя отдельные места по своему уровню рассчитаны не на студентов, а на работающих специалистов. Помимо продуманного последовательного расположения материала почти каждая глава сопровождается упражнениями и каждая - аннотированным списком литературы. Причем это замечательные списки литературы, существенно обогащающие книгу.    

 

Перевод и оформление

Книга неплохо оформлена. Невзирая на толщину (более 700 страниц), ее приятно читать: шрифт, указатели и рисунки подобраны уместно и хорошо продуманы.

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

Известно, что почти вся компьютерная терминология в русском языке заимствована. Точность и систематизация перевода американских терминов всегда составляла проблему, которая особенно обострилась в последние годы. Мне показалось, что переводчики книги Дейта справились с этим весьма своеобразно: перевели многие термины на свой лад, “не заглядывая в святцы”. В некоторых случаях найденные ими решения действительно можно счесть справедливым приговором какому-нибудь неудачно употреблявшемуся переводу. Но другие решения переводчиков кажутся спорными. Все-таки Entity/Relationship лучше по-прежнему именовать “сущность/связь”, а не “объект/свойство”, как это сделано в книге, даже если определенная близость Entity к “объекту” не оставляет сомнений (однако же близость, а не совпадение). Я согласен с оценкой сложившегося терминологического ряда переводных компьютерных терминов, как неудовлетворительной, но, во-первых, она не распространяется на все используемые переводы, а во-вторых, есть испытанный метод смягчения последствий такого рода разнобоя: привести оригинальный термин рядом с переведенным.    

 

Заключение

В силу определенных обстоятельств состояние с подготовкой разработчиков ПО вообще и БД в частности у нас сейчас критическое. По сути дела, мы имеем целое поколение молодых специалистов, не получивших должного вузовского образования по базам данных и осваивающих эту специальность в рабочих коллективах по документации конкретных СУБД или даже файловых систем. Нынешние студенты тоже в незавидном положении: и то сказать, в центральном и крупнейшем вузе страны, МГУ, есть всего один курс по базам данных, читаемый Сергеем Дмитриевичем Кузнецовым (низкий поклон ему за это!). В отличие от западных сверстников, изучающих общие принципы баз данных в институте и затем осваивающих конкретные системы по месту работы, наши студенты вынуждены сразу “писать скрипты”, подбирать параметры, рисовать схемы таблиц БД, т. е. начинать работать с частностями, едва имея понятие об общем. В результате зачастую неважно даже, с системой какого типа работает молодой специалист: с реляционной, объектной или реляционно-объектной, с системой X, Y или Z, - в любом случае его схема БД получается неквалифицированно составленной, ибо человек просто не знает, “как можно”, “как нужно” и “как бывает”.

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

Подводя итог, можно сказать, что, несмотря на видимое обилие компьютерной литературы на книжных прилавках, книг такого уровня у нас давно не выпускалось. Кажется вполне уместным вспомнить слова другого автора, сказанные по поводу другого издания: “Очень нужная и своевременная книга!”.

Владимир Пржиялковский - независимый консультант, к нему можно обратиться по адресам: prz@deneg.net, www.ccas.ru/~prz.