Вступ
У сучасній індустрії інформаційних технологій бази даних грають одну з головних ролей при побудові автоматизованих систем будь-якої складності і масштабу. Якість проектування і побудови, а також ефективність використання бази даних безпосередньо впливає на загальне функціонування системи або програмного комплексу.
Кожна база даних визначається структурою, яка є не чим іншим як набором інструкцій на мові SQL, а точніше одному з її діалектів. Тим самим, процес аналізу якості структури бази даних полягає в аналізі її SQL-коду.
Вже існують системи, що виконують це завдання для інших мов програмування, але саме створення системи автоматизованого аналізу якості структури бази даних (САБД) дозволить розробникам і адміністраторам значно збільшити ефективність своєї роботи і вчасно реагувати на помилки ще на етапі побудови баз даних.
Актуальність
Згаданий раніше процес аналізу якості структури бази даних по своїй суті є статичним аналізом SQL-коду. У сучасному світі розробки програмного забезпечення статичний аналіз є запорукою успіху всього проекту. Правильне і своєчасне вбудовування цього етапу в процес написання коду може значно заощадити як тимчасові, так і фінансові ресурси. З огляду на те, наскільки широко, на цей час, використовуються СУБД з підтримкою SQL, інструмент, що дозволяє комплексно оцінити якість і зв'язність написаного SQL-коду, може бути украй затребуваний. Важливо відзначити, що пропорційно зростанню програмної системи зростає і кількість помилок, які можуть бути допущені при написанні вихідного коду, тому в сфері розробки баз даних, де нерідко можна зустріти великі програмні комплекси, статичний аналіз є особливо актуальним.
Цілі і завдання дослідження
Мета даної роботи полягає в дослідженні і виборі оптимальних методів статичного аналізу SQL-коду, що дозволяють провести оцінку якості стуктури бази даних. За результатами роботи над системою повинна бути вирішена задача надання можливості розробнику вбудовування її в процес опису та побудови структури бази даних і отримання результатів аналізу у вигляді переліку вразливостей, помилок або рекомендацій щодо поліпшення.
В ході роботи над проектом планується провести: аналіз предметної області і постановка задачі; анализ существующих решений данной задач; аналіз методів попередньої підготовки коду для подальшої обробки, огляд і вибір відповідних цьому етапу інструментів; визначення критеріїв структури бази даних для проведення аналізу; аналіз методів обробки синтаксичного дерева отриманого на етапі підготовки коду [10]; огляд існуючих методів статичного аналізу, вибір оптимальних для вирішення поставленого завдання і їх застосування; впровадження розробленої системи в процес побудови баз даних і її практичне застосування.
Об'єктом дослідження є аналіз якості стуктури бази даних. Предметом дослідження є процес статичного аналізу SQL-коду бази даних.
Аналіз існуючих світових рішень
З існуючих систем автоматизованого аналізу структур реляційних баз даних можна виділити продукт Microsoft Total Access Analyzer, призначений для СУБД Microsoft Office Access [6].
Дана програмна система працює як додаткова надбудова над Microsoft Access і: формує детальну і деталізовану документацію по аналізованої базі даних, з усілякими посиланнями на її об'єкти або їх SQL-код; проводить детальний аналіз об'єктів і зв'язків між ними, виявляючи помилки різних типів, а також можливі засоби їх усунення; оцінює втрати продуктивності і пропонує варіанти вирішення виявлених проблем; формує діаграми потоків даних і об'єктів, що дозволяють більш наочно уявити структуру бази даних.
Також варто відзначити компанію SonarSource з її системами для аналізу SQL-коду, зокрема для TSQL і PL/SQL діалектів [7]. Ця компанія має в своєму активі розробки аналізаторів коду для більшості нині популярних мов програмування. Всі вони відповідають єдиному інтерфейсу застосування і використовуються в веб-застосунок SonarQube, яке дозволяє маніпулювати всіма нюансами статичного аналізу: задавати або змінювати правила і критерії аналізу, переглядати результати аналізу, класифіковані за категоріями і отримувати кількісні оцінки якості аналізованого коду.
В контексті СУБД Oracle потрібно згадати Visual Expert. Це програмне рішення поставляється в вигляді як настільного так і серверного застосунка. Основним його напрямом є візуалізація складових структури бази даних, зручна навігація і пошук по ним. Але в переліку функціоналу продукту також заявлений статичний аналіз PL/SQL-коду.
Аналіз існуючих локальних рішень
Серед проектів випускників ДонНТУ в області аналізу і оптимізації роботи з базами даних варто виділити магістерську роботу Заславського В.А. «Система оптимізації клієнтських запитів до серверів розподіленої бази даних »[9].
У цій роботі мова йде не про статичну структуру бази даних, а про динамічну складову роботи з нею - клієнтських запитах. Розроблена тут система використовує «мурашиний алгоритм» для пошуку оптимального плану запиту, тим самим оптимізуючи вхідний запит.
Відмінною рисою проекту є те, що основна увага автора приділена роботі з розподіленими базами даних і відповідно розподіленими запитами. Упор при оптимізації робиться на мережеві витрати, а не на реляційні особливості бази даних і запиту. Почасти, це можна вважати недоліком, але в цілому це є специфікою проекту і проведених досліджень.
Основні поняття і алгоритм роботи системи
Для того, щоб більш детально розкрити сутність системи автоматизованого аналізу якості структури бази даних, потрібно дати визначення основним поняттям, що зустрічаються на тому чи іншому етапі роботи даного програмного комплексу.
Статичний аналіз коду – це процес, що полягає у виявленні логічних і стилістичних помилок у вихідному коді. Статичний аналіз в якійсь мірі є аналогом процесу огляду коду (code review), але в автоматизованому вигляді. Зазвичай на практиці використовуються обидва підходи, так як кожен має ряд своїх переваг [3].
Варто відзначити, що сам процес аналізу коду є завершальним етапом ланцюжка послідовних операцій. В його основі лежать процедури лексичного і синтаксичного розбору, реалізація яких безпосередньо залежить від специфіки тексту, у даному випадку програмного коду.
Лексичний аналіз або розбір являє собою процес аналізу і розпізнавання певних елементів або їх груп (лексем) у вхідному наборі або послідовності символів, для їх подальшої ідентифікації і виділення токенов (токенізація). У загальному випадку в процесі лексичного аналізу вхідними даними є потік символів, а вихідними - набір класифікованих токенов (класифікація може мати різні рівні складності) [1].
Синтаксичним аналізом називається процес обробки набору токенов (в загальному випадку лексем) певної формальної мови з її граматикою. Даний процес виконується синтаксичним аналізатором (парсером), який приймає на вхід результати роботи попереднього лексичного аналізу. Вихідними даними синтаксичного аналізу є синтаксичне дерево або дерево розбору, що представляє із себе всю синтаксичну структуру аналізованої послідовності символів [2].
Зв'язка з лексичного і синтаксичного аналізатора використовується в багатьох областях програмування і не тільки, але ручне їх написання є досить трудомістким процесом, тому в багатьох програмних продуктах, компіляторах, інтерпретатора і т.д. використовуються генератори аналізаторів [8].
Генератори лексичних і синтаксичних аналізаторів беруть на вхід лексичну і синтаксичну структуру мови в деякому формальному поданні, на виході ж ми отримуємо вихідний код Лексера і парсера на одній з мов програмування (мова залежить від обраного генератора).
Як видно, аналіз SQL-коду структури бази даних складається з декількох послідовних перетворень вихідного коду і подальшої його обробки. Повний алгоритм роботи САБД наведено на малюнку 1.
Малюнок 1 - Повный алгоритм роботы САБД(Анімація: 5 кадрів, циклів повторення - 5, час між кадрами - 0.8 с., розмір 38 Кб)
Техніки та методології статичного аналізу
Однією з найбільш важливих технік статичного аналізу коду є аналіз потоків даних. Це метод збору інформації про можливі набори обчислених значень і варіантах їх використання в різних точках програми [4]. Дані, отримані в результаті цього процесу, часто використовуються при оптимізації програми. Даний процес можливий завдяки побудові та аналізу графа потоку управління програмою (ГПУ) (мал 2.).
Малюнок 2 - Граф потоку управління програмою
ГПУ є поданням з використанням графа всіх шляхів виконання програми. У графі потоку управління кожен вузол являє базовий блок, тобто прямолінійний фрагмент коду без будь-яких переходів. Спрямовані ребра використовуються для подання зв'язків і переходів між базовими блоками в потоці управління. У більшості нотацій є два спеціально позначених блоку: вхідний блок, через який управління входить в граф потоку, і вихідний блок, через який виходить весь потік управління [5].
Аналіз подібної структури дозволяє визначити місця обчислення значень певних змінних і виявити блоки коду, в яких ці значення використовуються. Таким чином, можна простежити шлях змінних і їх значень за програмою і виявити вразливості або можливості для оптимізації.
Також варто відзначити техніку пошуку по відповідності шаблоном (pattern matching). Вона полягає в складанні переліку певних антипаттернів використання тих чи інших конструкцій мови і виявленні у вхідному коді фрагментів, їм відповідних.
Для мови SQL в контексті опису структури бази даних можна навести приклад виявлення стилістичних і логічних невідповідностей методом зіставлення з шаблоном. На малюнку 3 представлено два варіанти опису таблиць. У першому випадку допущена логічна помилка, так як поле таблиці «users» неявно посилається на таблицю «roles» - відсутній зовнішній ключ. У другому випадку допущена стилістична помилка, тому що зовнішній ключ створений, але ім'я поля задано невідповідно стандартам.
Малюнок 3 - Помилки в структурі бази даних
Подібним чином можна проаналізувати будь яке формалізоване правило. Відштовхуючись від специфікації SQL і сформованих суспільством розробників рекомендацій можна сформувати необхідний перелік цих правил, для ефективної роботи автоматизованої системи статичного аналізу.
Висновки
У даній роботі були описані основні поняття і предмет магістерського проекту.
Було проведено аналіз існуючих рішень, за підсумками якого можна зробити висновок, що на даний момент універсальних рішень по аналізу якості структури бази даних в контексті будь-якого діалекту SQL немає.
Також були розглянуті техніки статичного аналізу коду, які будуть застосовані при розробці САБД. Перелік застосовуваних технік необхідно буде розширити для покриття аспектів аналізу, втрачених в існуючих системах.
За результатами проведеної роботи планується продовження досліджень і практичне застосування досягнень.
Список джерел
1. Хантер, Р. Основные концепции компиляторов / Р. Хантер // М.: "Вильямс", 2002. – 256 с.
2. Ульман, Дж. Теория синтаксического анализа, перевода и компиляции / Дж. Ульман, А. Ахо // М: "Мир", 1978. – 614 с.
3. Brewer, W. Database Code Analysis [Электронный ресурс] / W. Brewer // Red Gate. – Режим доступа: https://www.red-gate.com/simple-talk/sql/database-devops-sql/database-code-analysis/ – Загл. с экрана.
4. Khedker, U. Data Flow Analysis: Theory and Practic / U. Khedker, A. Sanyal, B. Sathe // CRC Press, 2009. – 328 p.
5. Ullman, J. Global Data Flow Analysis and Iterative Algorithms [Электронный ресурс] / J. Ullman, B. John // Sarita Adve's Research Group. – Режим доступа: http://rsim.cs.uiuc.edu/arch/qual_papers/compilers/kam.pdf – Загл. с экрана.
6. Microsoft Total Access Analyzer [Электронный ресурс] // Microsoft Total Access Analyzer. – Режим доступа: http://www.fmsinc.com/microsoftaccess/documentation/manual/index.html – Загл. с экрана.
7. Sonarsource [Электронный ресурс] // Sonarsource. – Режим доступа: https://www.sonarsource.com/ – Загл. с экрана.
8. Генераторы лексических и синтаксических анализаторов [Электронный ресурс] // Kulichki. – Режим доступа: http://www.kulichki.net/kit/tools/lexparse.html – Загл. с экрана.
9. Савкова, Е.О. Система оптимизации клиентских запросов к серверам распределённой базы данных [Электронный ресурс] / Е.О. Савкова, В.А. Заславский // Портал магистров ДонНТУ. – Режим доступа: http://masters.donntu.ru/2011/fknt/zaslavskiy/diss/index.htm – Загл. с экрана.
10. Карпов, Ю.Г. Основы построения трансляторов / Ю.Г. Карпов // СПб.: БХВ-Петербург, 2009. – 272 с.