вторник, 6 января 2015 г.

Плохие практики при работе с БД

1. Запрос "СЕЛЕКТ ЗВЁЗДОЧКА"

Запрос вида

"SELECT * ..."

Почему плохо: потому что это мина замедленного действия, которая может приветси к торможению при расширении модели БД.
Пример: была таблица из 2-х полей к которой мы применили запрос select * и реально нам для работы в конкретном сценарии нужно было только эти 2 поля.
Через 2 года модеь расширилась, таблица выросла до 20-ти полей, причем появились "длиннотекстовые" поля и блобы(картинки).
Этот же запрос, даже там, где дотстаточно было бы 2- полей теперь всегда выбирает 20.
как нужно: явно указывайте выбираемые поля через запятую. Используйте sql-менеджер для ускорения работы (Детали - у Луценко)

2. Обращение к полям в датасете по номеру.


Это тоже "бомба замедленного действия" , т.к. запрос и обращение к его полям могут быть визуально разделены в прграмме. И, если через год кто-то добавит в средину запроса новое поле (расширяя модель), то сразу нарушится порядок полей. И весь ваш код, в котором Вы обращаетесь к полю по номеру - рушится.
И хорошо, если ошибка видна сразу, а может же случиться, что одно поле переместится на место другого поля, такого-же типа, явной ошибки не будет, и система будет продолжать считать, только данные уже будут не те (например если из-за сдвига подменится поле "сумма заказа" на "сумма заказа со скидкой").
Кроме того очень ухудшается читаемость кода. Как например найти нужное поле в 20-ти строках присваивания вида

ДатаСет.Поле[1] = значение
ДатаСет.Поле[2] = значение
ДатаСет.Поле[3] = значение
...
ДатаСет.Поле[20] = значение


Как нужно: обращайтесь к полям по имени.

3. Формирование запроса в коде путем склеивания строк (подстановка параметров в виде текста)


почему плохо:
а) увеличивается риск получить простейшую ошибку, если вы подставляете в запрос строку, а в строке есть кавычка - она сломает ваш код.
б) увеличивается риск хакнуть систему путем sql injection (посмотрите в вики).
в) сложно отлаживать запрос, например если захотиете вытащить его из программы и проверить в скл-менеджере

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

Комментариев нет:

Отправить комментарий