СУБД для программиста: базы данных изнутри
Покупка
Основная коллекция
Тематика:
Системы управления базами данных (СУБД)
Издательство:
СОЛОН-Пресс
Автор:
Тарасов Сергей Витальевич
Год издания: 2020
Кол-во страниц: 320
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-2-7466-7383-0
Артикул: 657026.02.99
К покупке доступен более свежий выпуск
Перейти
Книга охватывает различные этапы разработки и сопутствующие им ситуации из практики программистов приложений, работающих с системами управления базами данных. Даются рекомендации по выбору решений как в проектировании (архитектуре), так и в программировании автоматизированных информационных систем уровня предприятия. Приводятся примеры для различных СУБД и моделей: Microsoft SQL Server, PostgreSQL, Firebird, Oracle, XML, NoSQL. Для программистов, студентов и других специалистов в области информационных технологий, а также всех интересующихся темой разработки приложений баз данных.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- ВО - Магистратура
- 02.04.02: Фундаментальная информатика и информационные технологии
- 09.04.01: Информатика и вычислительная техника
- 09.04.03: Прикладная информатика
- Аспирантура
- 02.06.01: Компьютерные и информационные науки
- 09.06.01: Информатика и вычислительная техника
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
ǹ ȍ Ș ȋ ȍ ȑ Ǻ Ȉ Ș Ȉ ș Ȗ Ȋ СУБД для программиста Базы данных изнутри СОЛОН-Пресс 2020
УДК 621.396.218 ББК 32.884.1 Т 19 Тарасов С. В. СУБД для программиста. Базы данных изнутри. — М.: СОЛОН-Пресс, 2020. — 320 с.: ил. ISBN 978-2-7466-7383-0 EAN 9782746673830 Книга охватывает различные этапы разработки и сопутствующие им ситуации из практики программистов приложений, работающих с системами управления базами данных. Даются рекомендации по выбору решений как в проектировании (архитектуре), так и в программировании автоматизированных информационных систем уровня предприятия. Приводятся примеры для различных СУБД и моделей: Microsoft SQL Server, PostgreSQL, Firebird, Oracle, XML, NoSQL. Для программистов, студентов и других специалистов в области информационных технологий, а также всех интересующихся темой разработки приложений баз данных. Сайт журнала «Ремонт & Сервис»: www.remserv.ru Сайт издательства «СОЛОН-Пресс»: www.solon-press.ru По вопросам приобретения обращаться: ООО «СОЛОН-Пресс» Тел: (495) 617-39-64, (495) 617-39-65 E-mail: kniga@solon-press.ru, www.solon-press.ru ISBN 978-2-7466-7383-0 © Тарасов С. В., 2020 EAN 9782746673830 © «СОЛОН-Пресс», 2020
Посвящается моему отцу... Цивилизованный человек отличается от дикаря главным образом благоразумием, или, если применить немного более широкий термин, предусмотрительностью. Цивилизованный человек готов ради будущих удовольствий перенести страдания в настоящем, даже если эти удовольствия довольно отдалены. Б. Рассел, «История западной философии»
Содержание Введение ............................................................................................................. 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, то данная программа превращается хоть и в очень простую, но СУБД, позволяющую нам работать со структурированным текстом, как с таблицей на уровне колонок, строк и значений, а также посчитать итоги, средние и крайние величины. Положив 2 CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (запятой). 9
файл в разделяемый по локальной сети каталог, получаем примитивную многопользовательскую СУБД на основе все того же приложения. Исторически, в устройстве СУБД выделяли три уровня, предложенных ещё в 1975 году в отчёте ANSI/X3/SPARC [1,2,5,7]: x внешний уровень наиболее близок к приложениям и пользователям, он связан со специфичными для них способами представления данных; x логический уровень, также называемый концептуальным, для описаний данных, не зависящих от физической реализации; x внутренний уровень, называемый также физическим, наиболее близок к физическому хранилищу данных, он связан со способами хранения на физических устройствах. Внутренний уровень не всегда связан с файловой системой. Наиболее развитые современные СУБД представляют собой по сути специализированную операционную систему3, способную управлять физическими устройствами хранения, кешем данных, процессами и потоками, оперативной памятью, асинхронным запуском и внутренним планировщиком задач минуя собственно операционную систему компьютера. Вернёмся к примеру с CSV-файлом и приложением LibreOffice Calc, наглядно показывающему, что даже в примитивной СУБД все три упомянутых уровня можно чётко выделить: x внутренний уровень представлен собственно файлом формата CVS со спецификацией его полного имени в файловой системе, кодовой страницы и символа разделителя; x логический уровень представлен объектом «Электронная таблица» (spreadsheet), позволяющим описать данные в терминах листов, колонок и строк независимо от того, работаем ли мы с CSV-файлом или с файлом в другом формате, возможно даже двоичном; 3 См. например информацию по SQLOS в составе Microsoft SQL Server 10
К покупке доступен более свежий выпуск
Перейти