Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тарасов С. В. СУБД для программиста. Базы данных изнутри

.pdf
Скачиваний:
79
Добавлен:
29.11.2021
Размер:
4.08 Mб
Скачать

Сергей Тарасов

СУБД для программиста

Базы данных изнутри

СОЛОН-Пресс

2015

УДК 621.396.218 ББК 32.884.1

Т 19

Тарасов С. В. СУБД для программиста. Базы данных изнутри.

М.: СОЛОН-Пресс, 2015. — 320 с.: ил.

ISBN 978-2-7466-7383-0

EAN 9782746673830

Книга охватывает различные этапы разработки и сопутствующие им ситуации из практики программистов приложений, работающих с системами управления базами данных. Даются рекомендации по выбору решений как в проектировании (архитектуре), так и в программировании автоматизированных информационных систем уровня предприятия. ПриводятсяпримерыдляразличныхСУБДимоделей: Microsoft SQL Server, PostgreSQL, Firebird, Oracle, XML, NoSQL.

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

Сайт журнала «Ремонт & Сервис»: www.remserv.ru Сайт издательства «СОЛОН-Пресс»: www.solon-press.ru

По вопросам приобретения книг обращаться:

ООО «ПЛАНЕТА АЛЬЯНС»

Тел: (499) 782-38-89, www.alians-kniga.ru

ISBN 978-2-7466-7383-0

© Тарасов С. В., 2015

EAN 9782746673830

© «СОЛОН-Пресс», 2015

Посвящается моему отцу...

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

Б. Рассел, «История западной философии»

Содержание

Введение .............................................................................................................

7

Основные понятия .............................................................................................

9

База данных и СУБД......................................................................................

9

Типы приложений: транзакционная и аналитическая обработка............

11

Клиент-серверные и встроенные СУБД.....................................................

14

Сноска. Firebird 2.5: состояние...............................................................

19

Основные модели данных: иерархическая, сетевая, реляционная..........

22

Иерархическая модель.............................................................................

22

Сетевая модель.........................................................................................

28

Реляционная модель.................................................................................

33

Другие подходы и модели данных..............................................................

37

Модель «Сущность-атрибут-значение» (EAV)......................................

37

Неполно структурированные модели данных.......................................

46

Документ-ориентированная модель и NoSQL ......................................

48

Многомерные модели данных ................................................................

53

О применимости NoSQL .........................................................................

56

Множественная и навигационная обработка, менеджеры записей.........

61

Объектная модель и объектно-реляционная проекция.............................

65

SQL как универсальный входной язык......................................................

75

Проектирование ...............................................................................................

78

Терминология уровней................................................................................

78

Первичные и прочие ключи........................................................................

83

Внешние ключи и связи...............................................................................

87

Нормализация и денормализация...............................................................

89

1НФ............................................................................................................

90

2НФ............................................................................................................

91

3НФ............................................................................................................

92

Деморализуем... то есть денормализуем: «звезда» и «снежинка»...........

93

Типовая архитектура данных аналитических приложений .....................

98

Переносимость между СУБД....................................................................

100

Абстрагирование от СУБД....................................................................

101

Абстрагирование от входного языка СУБД.........................................

102

Использование подмножества входного языка ...................................

104

Типовые структуры....................................................................................

104

4

 

Моделирование связей разных типов...................................................

105

Хронологические данные......................................................................

109

Иерархические данные и деревья в SQL .............................................

115

Интернационализация/локализация данных и проброс контекста.......

130

Метаданные................................................................................................

138

Реестр объектов и аудит.............................................................................

143

Безопасность и доступ к данным..............................................................

145

Проектирование физического хранения..................................................

151

Физическая организация памяти..........................................................

152

Оперативная и долговременная память...............................................

155

Дисковые массивы.................................................................................

157

Оперативная память...............................................................................

160

Индексация данных ...............................................................................

161

Секционирование данных.....................................................................

163

Неполно структурированные данные и высокая нагрузка.....................

165

Относительность понятия высокой нагрузки......................................

165

Особенности использования РСУБД и НСМД (NoSQL) ...................

168

Нужно ли моделировать?...........................................................................

172

Моделирование против ручного кодирования: пример......................

174

Большие данные как состояние отрасли..................................................

181

Программирование с испытаниями..............................................................

187

Типы соединений в SQL на примерах......................................................

187

Исходники и синхронизация структур.....................................................

190

Некоторые особенности программирования...........................................

200

Параметризация запросов и SQL-инъекции........................................

200

Сравнение с неопределёнными (пустыми) значениями.....................

203

Работа со строками ................................................................................

204

Работа с датами......................................................................................

207

Генерация идентификаторов записей...................................................

209

Транзакции, изоляция и блокировки........................................................

214

Уровни SQL-92 .......................................................................................

215

Блокировки.............................................................................................

219

Взаимные блокировки процессов (deadlock).......................................

222

Версии данных.......................................................................................

225

Проявления эффектов изоляции...........................................................

227

5

 

Толстые транзакции...............................................................................

232

Загрузка данных.........................................................................................

233

Пакетная загрузка...................................................................................

234

Вставка в толстой транзакции ..............................................................

240

РСУБД и неполно структурированные данные.......................................

241

Поддержка XML.....................................................................................

242

Поддержка JSON ....................................................................................

250

Выводы....................................................................................................

253

Постраничные выборки.............................................................................

254

Обзор способов постраничной выборки..............................................

256

Тестирование способов постраничной выборки.................................

260

Выводы....................................................................................................

271

SQL и модульное тестирование................................................................

271

Место модульного тестирования в системе испытаний.....................

271

Особенности разработки на процедурных расширениях SQL ..........

273

Пример задачи для модульного теста...................................................

273

Создаём специализированный макроязык...........................................

276

Остановиться и оглянуться...................................................................

283

Производительность SQL-запросов.........................................................

284

Общие рекомендации.............................................................................

284

Анализ плана выполнения запроса ......................................................

286

Поиск узких мест.......................................................................................

291

Основы нагрузочного тестирования.........................................................

297

Инструменты и методы .........................................................................

297

Учёт степени параллелизма..................................................................

301

SQL Server и MongoDB на простом тесте................................................

304

Тест вставки записей .............................................................................

304

Запросы и хронометраж........................................................................

308

Выводы....................................................................................................

315

Тестовые и демонстрационные базы данных..........................................

315

Заключение.....................................................................................................

317

Литература......................................................................................................

318

6

Введение

Разработка приложений баз данных распространена не только в «корпоративном секторе» автоматизации производственных процессов предприятий и их отделов. Из классического определения «программы — это алгоритмы плюс данные» следует, что сколь верёвочке не виться, пройдя через цепочку служб, запрос в итоге обрабатывается системой управления базами данных (СУБД) или её неполнофункциональным аналогом. Активно развивающийся рынок мобильных устройств широко использует встраиваемые (embedded) СУБД, ранее применявшиеся в основном для управления оборудованием.

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

Как правило, обладателям профильного образования преподаватели читали соответствующий теоретический курс в вузе [2], сопровождаемый практическими занятиями, пересекающийся по тематике с другими предметами. И, тем не менее, приступая к производственным задачам, вчерашний студент быстро ощутит отличие академических подходов от открывающегося взгляду пейзажа строек в недрах корпоративного софтостроения или в глубоком тылу веб-служб.

Тяжелее пришедшим в программирование из других областей деятельности. Окунувшись в реальность без багажа теории, соответствующего, как говорят американцы, бэкграунда, трудно сформировать в голове целостную картину, охватывающую важные детали происходящего, пропуская несущественные. Не хватает ни времени, ни мотивации читать достаточно скучные, толстые монографии вроде многократно переизданного Дейта [1], когда надо решать текущие задачи. Программисту становится не до вопросов философии кунг-фу, освоить бы побыстрее основные удары и блоки, чтобы получать поменьше оплеух от брыкающейся техники, исполненных значимости системных администраторов и недовольного начальства. Хорошо, если удастся выкроить часок-другой и потренироваться в сиквеле1 на примерах из книжки Грабера [3]...

1Сиквелом на жаргоне программистов называется язык SQL (Structured Query Language). Первоначальная его версия так и называлась SEQUEL. Впрочем, если вы будете говорить просто «эс-ку-эль», это не повлияет на ваш профессионализм.

7

Справиться с растущим потоком информации, не пропуская её через фильтры теоретического багажа, становится всё труднее. Например, последниегодыактивнопропагандируютNoSQL, можетбытьтамвсебудет проще, не надозадумываться о нормальных формахи тренироватьмозги на непривычную множественную обработку? Или может быть лучше работать через проекцию таблиц на объекты и не использовать прямой доступ к базе данных?

Книга «Софтостроение изнутри» [13] посвятила немалое количество сюжетов теме «как это не надо делать» и прогрессирующей в среде программистов некомпетентности в области баз данных, приводящей к катастрофическим для проектов последствиям на более поздних стадиях. В отличие от предтечи, настоящее издание будет носить ровно противоположный характер, следуя принципу «как это лучше сделать». Опираясь на опыт работы в продуктовом софтостроении и в технической экспертизе СУБД-решений, автор постарается в рамках повествования помочь вам не утонуть в информационном потоке и разобраться в часто возникающих на практике проблемах, не отрывая их от теории.

Почему не блог, а книга? Действительно, в Сети можно найти немало интересных статей. Однако, во-первых, чтобы найти нужную информацию по правильно заданным ключевым словам, а, во-вторых, оценить достоверность найденной публикации, нужно уже иметь определённый уровень компетенции, который кроме как чтением книг и практикой не поднять. Поэтому рекомендую и начинающим, и программистам с небольшим (2-3 года) опытом не увлекаться малоосмысленным копированием кода со страниц в Сети и прочим натягиванием глобуса на Меркаторову проекцию.

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

Все-таки, нет ничего практичнее, чем хорошая теория.

8

Основные понятия

«...пока мы не знаем закона природы, он, существуя и действуя помимо, вне нашего познания, делает нас рабами «слепой необходимости». В. Ульянов (Ленин)

База данных и СУБД

Основополагающие термины достаточно подробно рассмотрены в любой из монографий [1,2,4,5]. Тем не менее, чтобы однозначно понимать суть в ходе чтения, нам нужно выработать общий словарь. С этой целью я буду по мере необходимости приводить минимальный набор определений, составляющий основу дальнейшего изложения.

База данных (БД) — структурированное поименованное хранилище информации.

Из самого первого определения должно быть понятно, что содержащий начисленные квартальные премии сотрудников файл формата CSV2 является хоть и очень простой, но базой данных, а текстовый файл с научным описанием мышей-полёвок ей не является.

Система управления базами данных (СУБД) — специализированное программное обеспечение, обеспечивающее доступ к базе данных как к совокупности её структурных единиц.

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

2CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (запятой).

9

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

Исторически, в устройстве СУБД выделяли три уровня, предложенных ещё в 1975 году в отчёте ANSI/X3/SPARC [1,2,5,7]:

внешний уровень наиболее близок к приложениям и пользователям, он связан со специфичными для них способами представления данных;

логический уровень, также называемый концептуальным, для описаний данных, не зависящих от физической реализации;

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

Внутренний уровень не всегда связан с файловой системой. Наиболее развитые современные СУБД представляют собой по сути специализированную операционную систему3, способную управлять физическими устройствами хранения, кешем данных, процессами и потоками, оперативной памятью, асинхронным запуском и внутренним планировщиком задач минуя собственно операционную систему компьютера.

Вернёмся к примеру с CSV-файлом и приложением LibreOffice Calc, наглядно показывающему, что даже в примитивной СУБД все три упомянутых уровня можно чётко выделить:

внутренний уровень представлен собственно файлом формата CVS со спецификацией его полного имени в файловой системе, кодовой страницы и символа разделителя;

логический уровень представлен объектом «Электронная таблица» (spreadsheet), позволяющим описать данные в терминах листов, колонок и строк независимо от того, работаем ли мы с CSV-файлом или с файлом в другом формате, возможно даже двоичном;

3 См. например информацию по SQLOS в составе Microsoft SQL Server

10