Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

tags:database [15/12/2010 22:31]
tags:database [29/10/2020 16:32] (текущий)
Строка 1: Строка 1:
 +====== <database ... > ======
 + 
 +''Тэг для описания всей структуры прикладной БД или ее части. ''
 +----
 +===== Синтаксис =====
 +<file>
 +<database>
 +   [<db>
 +      sql;
 +      sql;
 +      ...
 +    <db/>]
 +   [{<patch>
 +      sql;
 +      ...
 +    <patch/>}]
 +<database/>
 +</file>
  
 +===== Атрибуты database =====
 + 
 +==== Основные атрибуты (R/W): ====
 +
 +^  Название  ^  Тип  ^  Описание  ^
 +|  **component-id**  |  [[intro:types#string]]  |Кодовое условное имя базы данных. Однажды созданное, оно никогда не должно изменяться. Под эти именем будет сохраняться в спецтаблицы служебная информация о версии БД. \\ Значения "last" и "first" являются зарезервированными и запрещены к использованию.|  
 +|  **order**  |  ''first | last | component_id_value''  |Атрибут, регулирующий порядок выполнения данного <database> относительно остальных, описанных в данном приложении. \\ <html><font color="blue">first</font></html> - данный <database> выполняется первым среди всех <database>. Данное значение рекомендуется использовать для <database> логически самостоятельных компонент. \\ <html><font color="blue">last</font></html> - данный <database> выполняется последним среди всех <database>. Данное значение является значением по умолчанию и рекомендуется к использованию в <database>, описывающих структуру прикладной БД. \\ <html><font color="blue">component_id_value</font></html> - значение атрибута component-id того <database>, после которого должен быть выполнен текущий.|  
 +
 +
 +
 +===== Атрибуты db =====
 +
 +==== Основные атрибуты (R/W): ====
 +
 +^  Название  ^  Тип  ^  Описание  ^
 +|  **version**  |  [[intro:types#number]]  |Числовой номер версии. С этой версией сравниваются версии патчей и те, которые старше - выполняются.|  
 +|  **file**  |  [[intro:types#string]]  |Имя файла, содержащего SQL-запросы, требующие выполнения. Другими словами, все запросы можно писать либо внутри тэга, либо в отдельном файле, либо и там и там.|
 +
 +====  Событийные атрибуты (R/W): ====
 +
 +^  Название  ^  Тип  ^  Описание  ^
 +|  **onBeforeExecute**  |  [[intro:types#code]]  |Вызывается перед выполнением. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +|  **onExecuted**  |  [[intro:types#code]]  |Вызывается после успешного выполнения. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +|  **onError**  |  [[intro:types#code]]  |Вызывается в случае аварийного завершения. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +
 +
 +
 +===== Атрибуты patch =====
 + 
 +==== Основные атрибуты (R/W): ====
 +
 +^  Название  ^  Тип  ^  Описание  ^
 +|  **version**  |  [[intro:types#number]]  |Числовой номер версии. Патчи выполняются в соответствии со своими номерами. Из общего списка патчей выбираются те, чья версия больше текущей версии БД.|  
 +|  **file**  |  [[intro:types#string]]  |Имя файла, содержащего SQL-запросы, требующие выполнения. Другими словами, все запросы можно писать либо внутри тэга, либо в отдельном файле, либо и там и там.|  
 +
 +==== Событийные атрибуты (R/W): ====
 +
 +^  Название  ^  Тип  ^  Описание  ^
 +|  **onBeforeExecute**  |  [[intro:types#code]]  |Вызывается перед выполнением. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +|  **onExecuted**  |  [[intro:types#code]]  |Вызывается после успешного выполнения. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +|  **onError**  |  [[intro:types#code]]  |Вызывается в случае аварийного завершения. Правила описания см. ([[intro:event_desc|Описание событий в ApplicationXML]]).|  
 +
 +
 +
 +===== Описание =====
 +
 +
 +Тэг <database> является механизмом для создания и поддержания в актуальном состоянии структуры прикладной БД. В <database> можно определять как всю структуру, так и ее отдельную (отдельные) логическую часть. Соответственно, тэг может встречаться один или несколько раз. Например, каждую таблицу можно описать отдельным <database> (хотя это избыточно, но это можно).
 +<database> включает в себя два подтэга: 
 +     ***<db>** описывает структуру БД. Внутри <database> <db> может встречаться только однажды. 
 +     ***<patch>** последовательно описывает изменения структуры БД. Внутри <database> <patch> может встречаться сколько угодно раз. 
 +
 +Тэги <db> и <patch> имеют атрибут version. При создании БД значение версии БД сохраняется в спецтаблице. При выполнении патчей версия БД повышается и новое значение также сохраняется в спецтаблице. 
 +
 +
 +
 +//**Алгоритм работы <database> при установке приложения на новом рабочем месте: **//
 +
 +     *Создаем БД на основе SQL-ей из <db>. 
 +     *Если есть патчи с версией, больше чем db.version, последовательно выполняем их в соответствии с их version. 
 +
 +
 +
 +//**Алгоритм работы <database> при установке обновления приложения (т.е. БД уже создана): **//
 +
 +      *Если есть патчи с версией, больше чем db.version, последовательно выполняем их в соответствии с их version. 
 +
 +
 +
 +Таким образом есть два вариант работы с тэгом <db>: 
 +
 +      * **А.** В <db> записываем только начальную структуру, а все изменения выполняем патчами. В этом случае процесс установки приложения на новом месте при большом кол-ве патчей может занять большое кол-во времени. 
 +      * **Б.** Содержимое <db> поддерживаем в актуальном состоянии, т.е. вносим все те изменения, для которых параллельно пишем патчи. При этом db.version постоянно повышаем до максимального из патчей. При установе программы на новом месте процесс создания БД пройдет гораздо быстрее. 
 +Любой вариант допустим. Выбор - за программистом. 
 +
 +
 +
 +В программе тэг <database> может встречаться несколько раз, но с разными сomponent-id. database.component-id должен содержать условное кодовое имя БД (или той части, которую описывает данный <database>). Под этим кодовым именем будет сохраняться в спецтаблице версия этой структуры. 
 +
 +Таким образом программист может независимо вести структуры БД для разных модулей программы в разных файлах. Файлы, содержащие тэги <database> могут подключаются тэгом <include>. 
 +
 +SQL-запросы внутри тэгов отделяются друго от друга точкой с запятой ";". 
 +
 +
 +===== Примеры =====
 +<code>
 +<database component-id="homeLibrary">
 +     <db version="1">
 +            create table genre ( id integer not null auto_increment,
 +                                 name varchar(50),
 +                                 modified_date datetime not null,
 +                                 primary key (id)
 +                                ); 
 +
 +            create table authors (id integer not null auto_increment,
 +                                  name varchar(50),
 +                                  lastname varchar(20),
 +                                  firstname varchar(20),
 +                                  middlename varchar(20),
 +                                  modified_date datetime not null,
 +                                  primary key (id)
 +                                );
 +                                          
 +            create table books ( id integer not null auto_increment,
 +                                 name varchar(50),
 +                                 genre_id integer not null,
 +                                 author_id integer not null,
 +                                 modified_date datetime not null,
 +                                 primary key (id),
 +                                 constraint fk_books_genre
 +                                 foreign key (genre_id) references genre(id),
 +                                 constraint fk_books_author
 +                                 foreign key (author_id) references authors(id)
 +                               );
 +     </db>
 +        
 +     <patch version="2">
 +           alter table books add buy_date date;
 +     </patch>
 +</database>
 +</code>
 
 
Recent changes RSS feed Valid XHTML 1.0 Valid CSS