воскресенье, 15 апреля 2012 г.

Source code of DB objects

Представьте такую ситуацию: команда разработчиков работает над программой. При этом исходный код приложения нигде не хранится. Каждый программист с помощью специального декомпилятора выгружает нужный код из бинарника, работает с ним, а потом вновь собирает и отдает на дальнейшую разаработку коллегам.

Как вы думаете, это нормальная ситуация? Думаю, что нет. Но почему-то такой подход довольно часто применяется при разработке приложений БД. Объекты создаются и изменяются "наживую" прямо в БД. Большинство специализированных IDE предоставляют массу "удобных" инструментов для этого - поиск нужного объекта с помощью навигационного дерева, его модификация несколькими щелчками мыши и т.д. При этом об исходном коде мало кто задумывается - а при сборке версии часто используются утилиты, которые на основании кода текущей базы и кода базы продакшена генерируют диф-скрипт (для меня до сих остается загадкой как, т.к. альтер (таблицы например) можно сформировать множеством спосбов, все зависит от конкретного случая, от логики изменения и т.д.). Получается, что исходного кода базы как бы и не существует, он считается неким машинным кодом, трудно воспринимаемым человеком, который полностью отдается на откуп визуальным средствам разаработки. Программист работает не с функционалом своей СУБД, а с функционалом конкретной IDE, неким красивым и (как кажется первое время) удобным промежуточным слоем. При этом приходится изучать именно IDE, а не саму СУБД.

Стоит помнить, что после того как вы с помощью собственно написанного кода (выверенного, отформатированного по корпаративным стандартам, оформленного комментариями) создаете объект БД, этот код нигде не сохранится, вы потеряете его, а в замен получите, то что соберет за вас машина (IDE, специальные утилиты или библиотеки), опираясь на словарь данных БД. При этом теряется история изменения объектов (становится невозможным узнать/вспомнить кто, когда и зачем создавал/удалял/изменял тот или иной объект), могут возникать конфликты при совместной разработке и еще очень много чего.

Об этом можно почитать в "PLSQL Standards Developed for the PLSQL Starter Framework" в главе "Source Code Control":

Remember to never modify the PL/SQL stored in the database. Work from the source code file instead. Yes, modifying the compiled code inside the database is technically feasible, but a really bad idea. It is comparable in some ways to modifying Java bytecode or C object files.

и в главе "Data Models and DDL":

Most DDL is still created by hand. Make it clean, commented and readable, just like source code.

Напоследок приведу код создания простой таблицы в Oracle и то, что из него получается после выгрузки из БД различными утилитами.
Исходный код создания таблицы:
-- This is test_table
CREATE TABLE test_table (
  id NUMBER(38),  -- PK
  value NUMBER(10,2),  -- main value
  width NUMBER(5,0) -- main width value
);
DBMS_METADATA:
  CREATE TABLE "OBJECTMAN"."TEST_TABLE" 
   ( "ID" NUMBER(38,0), 
 "VALUE" NUMBER(10,2), 
 "WIDTH" NUMBER(5,0)
   ) 
Tora:
CREATE TABLE objectman.test_table
(
    id                               NUMBER(38)                      
  , value                            NUMBER(10,2)                    
  , width                            NUMBER(5)                       
)
TOAD Eclpise plugin:
create table test_table
(
    id       number(38),
    value    number(10,2),
    width    number(5)
)


Как видно солянка полная, кто на что горазд.

Конечно это не значит, что нужно полностью отказаться от современных визуальных средств и работать в консольном редакторе. Самое главное работать именно с исходным кодом вашего приложения БД, контроллировать его самостоятельно, не отдавать на откуп машине. Исходный код приложений БД ничем не хуже кода Java или C++ приложений и требует к себе такого же обращения: форматирование, комментарии, контроль версий и т.д.

Несколько рекомендаций:
1. Весь код БД (DML, DDL, DCL, TCL и т.д.) необходимо хранить в репозитории (один объект = один файл);
2. Исходя из первого пункта, должна быть возможность собрать готовую к использованию "чистую" базу "с нуля", используя исходники из репозитория (нет необходимости делать дампы базы, вырезать ненужные(тестовые) данные и т.д.)
3. Править и компилировать код объекта БД нужно именно из файла (т.о. вместо навигатора по объктом БД вашей IDE станет актуален навигатор по файлам проекта в репозитории - найти файл, открыть на редактирование, накатить на базу).

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

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