Внимание!!!! Книга удалена по требованию
правообладателя!!!!
Отзывы о книге «Антипаттерны SQL»....14
Благодарности....17
Введение....18
О втором издании....19
Для кого эта книга....19
О книге....20
Условные обозначения....20
Онлайн-ресурсы....21
О научном редакторе русского издания....22
От издательства....22
Глава 1. Что такое антипаттерн?....23
Типы антипаттернов....23
Анатомия антипаттерна....24
Диаграммы «объект — отношение»....25
Пример базы данных....26
Часть I. Антипаттерны логического проектирования баз данных....29
Глава 2. Кривая дорожка....30
Цель: хранение многозначных атрибутов....31
Антипаттерн: форматирование списка, разделенного запятыми....31
Как распознать антипаттерн....35
Решение: создание таблицы пересечений....36
Мини-антипаттерн: разбиение CSV-данных на строки....39
Глава 3. Наивное применение деревьев....42
Цель: хранение и загрузка иерархий....43
Антипаттерн: постоянная зависимость от родителя....43
Как распознать антипаттерн....47
Допустимые применения антипаттерна....48
Решение: использование альтернативных моделей деревьев....48
Какое решение использовать?....60
Мини-антипаттерн: на моем компьютере все работает....62
Глава 4. Обязательный ID....64
Цель: установление соглашений первичного ключа....65
Антипаттерн: на любой случай жизни....66
Как распознать антипаттерн....72
Допустимые применения антипаттерна....72
Решение: ситуационное....73
Глава 5. Сущность без ключа....77
Антипаттерн: без ограничений....78
Как распознать антипаттерн....81
Допустимые применения антипаттерна....82
Решение: объявление ограничений....83
Глава 6. Сущность — атрибут — значение....86
Цель: поддержка переменных атрибутов....86
Антипаттерн: использование обобщенной таблицы атрибутов....88
Как распознать антипаттерн....94
Допустимые применения антипаттерна....94
Решение: моделирование подтипов....95
Глава 7. Полиморфная связь....103
Цель: ссылки на несколько родительских таблиц....104
Антипаттерн: использование внешнего ключа двойного назначения....104
Как распознать антипаттерн....108
Допустимые применения антипаттерна....109
Решение: упрощение отношений....109
Глава 8. Многостолбцовые атрибуты....116
Цель: хранение многозначных атрибутов....116
Антипаттерн: создание нескольких столбцов....117
Как распознать антипаттерн....120
Решение: создание зависимой таблицы....122
Мини-антипаттерн: хранение цен....123
Глава 9. «Трибблы» метаданных....125
Цель: обеспечение масштабируемости....126
Как распознать антипаттерн....131
Допустимые применения антипаттерна....132
Решение: партицирование и нормализация....133
Часть II. Антипаттерны физического проектирования баз данных....137
Глава 10. Ошибки округления....138
Цель: дроби вместо целых чисел....139
Антипаттерн: использование типа данных FLOAT....139
Как распознать антипаттерн....143
Допустимые применения антипаттерна....143
Решение: тип данных NUMERIC....144
Глава 11. 31 вкус....146
Цель: ограничение столбца конкретными значениями....146
Антипаттерн: перечисление значений при определении столбца....147
Как распознать антипаттерн....151
Допустимые применения антипаттерна....151
Решение: определение значений в данных....152
Мини-антипаттерн: зарезервированные слова....154
Глава 12. Фантомные файлы....157
Цель: хранение графики или других больших данных....158
Антипаттерн: а что, если мне нужны файлы....158
Как распознать антипаттерн....162
Допустимые применения антипаттерна....162
Решение: использование типа данных BLOB при необходимости....164
Глава 13. Индексный дробовик....167
Цель: оптимизация производительности....168
Антипаттерн: беспорядочное использование индексов ....168
Как распознать антипаттерн....173
Допустимые применения антипаттерна....173
Решение: MENTOR....174
Мини-антипаттерн: индексирование каждого столбца....180
Часть III. Антипаттерны запросов....181
Глава 14. Страх неизвестного....182
Цель: отделить отсутствующие значения....183
Антипаттерн: использование NULL в качестве обычного значения и наоборот....183
Использование NULL в выражениях....183
Как распознать антипаттерн....186
Допустимые применения антипаттерна....188
Решение: использование NULL как уникального значения....188
Глава 15. Неоднозначные группы....194
Цель: получить строку с наибольшим значением в группе....195
Антипаттерн: ссылка на столбцы, не входящие в группу....195
Как распознать антипаттерн....198
Допустимые применения антипаттерна....199
Решение: выборка однозначных столбцов ....200
Мини-антипаттерн: портируемый SQL....205
Глава 16. Случайный выбор....207
Цель: получить образец строки данных....207
Антипаттерн: случайная сортировка данных....208
Как распознать антипаттерн....209
Допустимые применения антипаттерна....210
Решение: не упорядочивать…....210
Мини-антипаттерн: запрос нескольких случайных строк....215
Глава 17. Поисковая система для бедных....216
Цель: полнотекстовый поиск....216
Антипаттерн: предикаты сопоставления с шаблонами....217
Как распознать антипаттерн....218
Допустимые применения антипаттерна....218
Решение: правильный выбор инструмента для работы....219
Глава 18. Спагетти-запросы....230
Цель: сокращение количества запросов SQL....231
Антипаттерн: решение сложной задачи за один шаг....231
Как распознать антипаттерн....234
Допустимые применения антипаттерна....234
Решение: разделяй и властвуй....236
Глава 19. Неявные столбцы....241
Цель: компактность кода....242
Нарушение рефакторинга....243
Как распознать антипаттерн....245
Допустимые применения антипаттерна....245
Решение: явное указание столбцов....246
Часть IV. Антипаттерны разработки приложений....249
Глава 20. Незащищенные пароли....250
Цель: восстановление и сброс паролей....250
Антипаттерн: хранение паролей в текстовом виде....251
Как распознать антипаттерн....254
Допустимые применения антипаттерна....254
Решение: хранение соленого хеш-кода пароля....255
Глава 21. SQL-инъекции ....265
Цель: написание динамических запросов SQL....266
Антипаттерн: выполнение непроверенного ввода как кода....266
Как распознать антипаттерн....274
Допустимые применения антипаттерна....275
Решение: не доверяйте никому....275
Мини-антипаттерн: параметры запроса в кавычках....283
Глава 22. Чистка псевдоключа....285
Цель: очистка данных....286
Антипаттерн: заполнение пропусков....286
Как распознать антипаттерн....288
Допустимые применения антипаттерна....289
Решение: смириться....289
Мини-антипаттерн: автоматическое увеличение в группах....292
Глава 23. Не вижу зла....294
Цель: сокращение объема кода....295
Антипаттерн: мартышкин труд....295
Как распознать антипаттерн....298
Допустимые применения антипаттерна....298
Решение: корректное восстановление после ошибок....299
Мини-антипаттерн: чтение сообщений о синтаксических ошибках....301
Глава 24. Дипломатический иммунитет....303
Цель: применение лучших практик....304
Антипаттерн: второсортный SQL....304
Как распознать антипаттерн....305
Допустимые применения антипаттерна....306
Решение: формирование разносторонней культуры качества....306
Мини-антипаттерн: переименование....314
Глава 25. Стандартные рабочие процедуры....317
Цель: использование хранимых процедур....318
Антипаттерн: делай как я....319
Как распознать антипаттерн....323
Допустимые применения антипаттерна....324
Решение: переход на современные архитектуры приложений....324
Мини-антипаттерн: хранимые процедуры в MySQL....326
Часть V. Дополнение: мини-антипаттерны внешних ключей....329
Глава 26. Ошибки внешних ключей в стандартном SQL....330
Изменение направления ссылок....330
Ссылки на еще не созданные таблицы....331
Отсутствие ссылок на ключ родительской таблицы....333
Создание отдельных ограничений для всех столбцов составного ключа....334
Неверный порядок столбцов....335
Несоответствие типов данных....336
Создание осиротевших строк....338
Применение SET NULL к столбцам, не допускающим NULL....340
Несовместимые типы таблиц....342
Глава 27. Ошибки внешних ключей в MySQL....343
Использование больших типов данных....344
Внешние ключи MySQL с неуникальными индексами....346
Синтаксис ссылок по умолчанию....349
Несовместимые типы таблиц в MySQL....349
Приложение. Правила нормализации....351
Что значит «реляционный»?....352
Мифы о нормализации....354
Что такое нормализация?....355
Здравый смысл....366
Библиография ....367
Язык SQL необходим для работы со структурированными данными. Программисты, прекрасно знающие свой любимый язык (Java, Python или Go), не могут разбираться во всем, и часто не являются экспертами в SQL. Это приводит к появлению антипаттернов, — решений, которые на первый взгляд кажутся правильными, но со временем создают всё больше проблем.Научитесь выявлять и обходить многие из этих распространенных ловушек! Проведите рефакторинг унаследованного кошмара и превратите его в жизнеспособную модель данных!Примеры SQL-кода основаны на версии MySQL 8.0, но в тексте также упоминаются другие популярные РСУБД. В примерах кода используется Python 3.9+ или Ruby 2.7+.