автордың кітабынан сөз тіркестері Антипаттерны SQL. Как избежать ловушек при работе с базами данных
Эксперт — это человек, который совершил все возможные ошибки в очень узкой специальности.
Нильс Бор
3 Ұнайды
Однако с изменениями в файлах, расположенных вне базы данных, все иначе. Если вы удаляете файл, он немедленно становится недоступным для других клиентов. И если изменить содержимое файла, то другие клиенты увидят эти изменения сразу же — вместо предыдущего содержимого файла, отображаемого, пока транзакция не подтверждена.
1 Ұнайды
Вместо FLOAT и его родственников используйте тип данных SQL NUMERIC или DECIMAL для дробных чисел с фиксированной точностью.
Rounding-Errors/soln/numeric-columns.sql
ALTER TABLE Bugs ADD COLUMN hours NUMERIC(9,2);
ALTER TABLE Accounts ADD COLUMN hourly_rate NUMERIC(9,2);
Эти типы данных хранят числовые значения с точностью (precision), указанной в определении столбца.
1/3 + 1/3 + 1/3 = 1.000
0.333 + 0.333 + 0.333 = 0.999
Даже если увеличить точность, вы все равно не сможете сложить три приближения 1/3, чтобы получить точное значение 1.0. Этот компромисс неизбежен при использовании конечной точности для представления чисел с повторяющимися цифрами.
1/3 + 1/3 + 1/3 = 1.000000
0.333333 + 0.333333 + 0.333333 = 0.999999
Цель: дроби вместо целых чисел
Целые числа — полезный тип данных, но в нем могут храниться только такие числа, как 1, 327 или –19. Он не позволяет представлять дроби, например 2.5. Если вы работаете с числами с точностью, превышающей точность целого типа, вам понадобится другой тип данных. Например, денежные суммы обычно представляются целыми числами с двумя знаками в дробной части — $19.95 и т.д.
Таким образом, требуется хранить числовые значения, которые не являются целыми, и использовать их в арифметических вычислениях. Еще одна цель, которая обычно явно не формулируется: результаты арифметических вычислений должны быть верными.
О хранении иерархических данных и работе с ними в SQL можно еще много узнать. Есть хорошая книга Джо Селко (Joe Celko), в которой описаны иерархические запросы, — «Trees and Hierarchies in SQL for Smarties» [Cel04]. Другая книга с описанием деревьев и даже графов — «QL Design Patterns»[Tro06] Вадима Тропашко (Vadim Tropashko). Она написана более формальным, академическим языком.
Тогда у вас появляется другая идея: загрузить все комментарии и собрать из них древовидные структуры в памяти приложения, используя традиционные алгоритмы деревьев, которые вы изучали в школе. К сожалению, редакторы сайта говорят, что ежедневно на сайте публикуются десятки статей и к каждой статье могут быть сотни комментариев. Сортировать миллионы комментариев каждый раз, когда кто-то просматривает сайт, нецелесообразно
Некоторые разработчики не любят запросы, содержащие соединения; они считают их слишком медленными. Однако этот запрос использует индексы намного эффективнее, чем решение, приведенное выше в разделе «Антипаттерн: форматирование списка, разделенного запятыми
Аналогичным образом, если приложение получает данные, разделенные запятыми, из другого источника и вы просто хотите сохранить весь список в базе данных и позднее прочитать его точно в таком же виде, разделять значения не обязательно
Соединение двух таблиц в таких выражениях делает использование индексов полностью невозможным, так что производительность снова страдает
