Публикации

Дмитрий Тимофеев
Старший инженер-программист
21.09.2015

Реализация логической переструктуризации в интерпретации расширенной реляционной модели данных RM/​T

1. Вве­де­ние

В рабо­те [1] была пред­ло­же­на интер­пре­та­ция рас­ши­рен­ной реля­ци­он­ной моде­ли дан­ных RM/​T [2]. Соглас­но этой интер­пре­та­ции моле­ку­ляр­ные типы RM/​T могут быть опи­са­ны струк­ту­рой дере­ва с гори­зон­таль­ны­ми свя­зя­ми, дере­во долж­но быть логи­че­ским, что поз­во­лит лег­ко решать зада­чи пере­струк­ту­ри­за­ции дере­ва. Для такой струк­ту­ры долж­на под­дер­жи­вать­ся воз­мож­ность пред­став­ле­ния гори­зон­таль­ных свя­зей в виде логи­че­ских дере­вьев. Сур­ро­га­ты RM/​T долж­ны слу­жить для упо­ря­до­чи­ва­ния кор­те­жей. Так­же было пред­ло­же­но исполь­зо­вать для опи­са­ния этой интер­пре­та­ции моде­ли дан­ных RM/​T модель дан­ных XML, нако­нец, было пред­став­ле­но крат­кое опи­са­ние раз­ра­бо­тан­ной рас­ши­рен­ной моде­ли дан­ных, осно­ван­ной на моде­ли дан­ных RM/​T, для опи­са­ния кото­рой исполь­зу­ет­ся модель дан­ных XML.

В раз­ра­бо­тан­ной рас­ши­рен­ной моде­ли дан­ных иерар­хи­че­ская модель дан­ных в вари­ан­те XML накла­ды­ва­ет­ся как вто­рич­ная поверх реля­ци­он­ной. Это поз­во­ля­ет сохра­нить стро­гость реля­ци­он­ной моде­ли и при­вне­сти в неё допол­ни­тель­ные пре­иму­ще­ства иерар­хи­че­ской моде­ли, а так­же исполь­зо­вать для опи­са­ния моде­ли как реля­ци­он­ную алгеб­ру, так и язы­ки и стан­дар­ты плат­фор­мы XML: XML [3], Relax NG [4], Schematron [5], DOM [6], XPath [7, 8], XQuery [9].

Основ­ны­ми струк­тур­ны­ми ком­по­нен­та­ми раз­ра­бо­тан­ной моде­ли дан­ных явля­ют­ся поня­тие, объ­ект, экзем­пляр объ­ек­та, код экзем­пля­ра объ­ек­та, отоб­ра­же­ние.

Объ­ек­ты соот­вет­ству­ют типам эле­мен­тов XML-доку­мен­та, экзем­пля­ры объ­ек­тов – отдель­ным эле­мен­там, а поня­тия – атри­бу­там эле­мен­тов. С дру­гой точ­ки зре­ния объ­ек­ты соот­вет­ству­ют реля­ци­он­ным отно­ше­ни­ям, экзем­пля­ры объ­ек­тов – кор­те­жам отно­ше­ний, а поня­тия – атри­бу­там отно­ше­ний (рис. 1).


Рис 1. Струк­тур­ные ком­по­нен­ты моде­ли дан­ных

Если с точ­ки зре­ния XML пози­ция эле­мен­та это ключ есте­ствен­ный, то чисто с реля­ци­он­ной точ­ки зре­ния он видит­ся как ключ сур­ро­гат­ный. В раз­ра­бо­тан­ной моде­ли дан­ных этот ключ назы­ва­ет­ся кодом экзем­пля­ра объ­ек­та.

Для опи­са­ния свя­зей поня­тий с объ­ек­та­ми, а так­же свя­зей меж­ду объ­ек­та­ми вво­дит­ся ещё одна струк­ту­ра – отоб­ра­же­ние. Отоб­ра­же­ние вклю­ча­ет схе­му дере­ва объ­ек­тов и дере­во экзем­пля­ров. Дере­во объ­ек­тов соот­вет­ству­ет схе­ме ХML-доку­мен­та и может быть опи­са­но с помо­щью язы­ка Relax NG [4], а дере­во экзем­пля­ров – мно­же­ству ХML-доку­мен­тов, удо­вле­тво­ря­ю­щих этой схе­ме.

Базу дан­ных пред­ла­га­ет­ся моде­ли­ро­вать как сово­куп­ность дере­вьев инфор­ма­ци­он­ных объ­ек­тов с гори­зон­таль­ны­ми свя­зя­ми и со спе­ци­фич­ным для каж­до­го объ­ек­та набо­ром поня­тий.

Для иден­ти­фи­ка­ции отоб­ра­же­ний, объ­ек­тов и поня­тий пред­ла­га­ет­ся исполь­зо­вать уни­каль­ные в пре­де­лах базы дан­ных корот­кие коды. Отно­си­тель­но этих кодов опре­де­ля­ют­ся огра­ни­че­ния целост­но­сти и опе­ра­ции.

Так как зада­чей явля­ет­ся постро­е­ние логи­че­ской струк­ту­ры с воз­мож­но­стью пере­струк­ту­ри­за­ции, то и иерар­хи­че­ские свя­зи, и гори­зон­таль­ные свя­зи реа­ли­зу­ют­ся толь­ко на осно­ве зна­че­ний поня­тий, таким обра­зом, все свя­зи явля­ют­ся инфор­ма­ци­он­ны­ми.

В код экзем­пля­ра поми­мо пер­вич­но­го пози­ци­он­но­го клю­ча объ­ек­та, вклю­ча­ют­ся так­же внеш­ние клю­чи, ссы­ла­ю­щи­е­ся на экзем­пля­ры-пред­ки дан­но­го экзем­пля­ра (рис. 2).


Рис. 2. Реа­ли­за­ция иерар­хи­че­ских свя­зей

Исполь­зу­е­мый иерар­хи­че­ский пози­ци­он­ный пер­вич­ный ключ опре­де­ля­ет уни­каль­ность экзем­пля­ра не толь­ко в пре­де­лах роди­тель­ско­го экзем­пля­ра, но и в пре­де­лах любо­го экзем­пля­ра-пред­ка. Исполь­зуя метод редук­ции клю­ча, мож­но полу­чить доступ к любо­му пред­ку дан­но­го экзем­пля­ра объ­ек­та. Поэто­му, несмот­ря на избы­точ­ность дан­ных, дан­ный ключ явля­ет­ся наи­бо­лее пред­по­чти­тель­ным, так как поз­во­ля­ет реа­ли­зо­вать и под­дер­жи­вать иерар­хи­че­ские свя­зи авто­ма­ти­че­ски.

Гори­зон­таль­ные свя­зи реа­ли­зу­ют­ся поль­зо­ва­те­лем с помо­щью меха­низ­мов поль­зо­ва­тель­ских потен­ци­аль­ных и внеш­них клю­чей объ­ек­тов.

В моде­ли дан­ных преду­смат­ри­ва­ют­ся огра­ни­че­ния целост­но­сти: огра­ни­че­ния типов и поня­тий, огра­ни­че­ния объ­ек­тов и огра­ни­че­ния базы дан­ных. Огра­ни­че­ния целост­но­сти могут быть опи­са­ны с помо­щью язы­ка Schematron [5]. Бла­го­да­ря выбран­ной струк­ту­ре кодов экзем­пля­ров, пра­ви­ла целост­но­сти сущ­но­стей и пра­ви­ла ссы­лоч­ной целост­но­сти для иерар­хи­че­ских свя­зей под­дер­жи­ва­ют­ся авто­ма­ти­че­ски.

В моде­ли дан­ных пред­ла­га­ет­ся под­дер­жи­вать не толь­ко спе­ци­фи­ка­ци­он­ные опе­ра­ции, но и нави­га­ци­он­ные опе­ра­ции мани­пу­ли­ро­ва­ния дан­ны­ми, так как они предо­став­ля­ют боль­шую гиб­кость и сво­бо­ду в реа­ли­за­ции кон­крет­ных задач. Нави­га­ци­он­ные опе­ра­ции соот­вет­ству­ют низ­ко­уров­не­вым опе­ра­ци­ям моде­ли DOM [6] с неко­то­ры­ми рас­ши­ре­ни­я­ми. Спе­ци­фи­ка­ци­он­ные опе­ра­ции соот­вет­ству­ют реля­ци­он­ной алгеб­ре с рас­ши­ре­ни­ем опе­ра­ций на дере­вья объ­ек­тов. Спе­ци­фи­ка­ци­он­ные опе­ра­ции могут быть опи­са­ны с помо­щью язы­ка XQuery [9].

В дан­ной рабо­те рас­смат­ри­ва­ют­ся зада­чи логи­че­ской пере­струк­ту­ри­за­ции дере­ва с гори­зон­таль­ны­ми свя­зя­ми в раз­ра­бо­тан­ной моде­ли дан­ных – зада­ча пред­став­ле­ния гори­зон­таль­ных свя­зей в виде логи­че­ских иерар­хи­че­ских, зада­ча инвер­ти­ро­ва­ния иерар­хии.

В реля­ци­он­ной алгеб­ре выде­ля­ют­ся две опе­ра­ции, свя­зан­ные с созда­ни­ем новых струк­тур – это опе­ра­ции про­из­ве­де­ния и соеди­не­ния. Резуль­та­том этих опе­ра­ций в общем слу­чае явля­ет­ся неко­то­рое вычис­ля­е­мое вир­ту­аль­ное отно­ше­ние. Одна­ко если на уровне моде­ли такое отно­ше­ние явля­ет­ся вир­ту­аль­ным, то на физи­че­ском уровне всё рав­но созда­ют­ся кор­те­жи это­го вир­ту­аль­но­го отно­ше­ния.

Кон­крет­ной зада­чей рабо­ты явля­ет­ся реа­ли­за­ция опе­ра­ций про­из­ве­де­ния и соеди­не­ния без созда­ния допол­ни­тель­ных физи­че­ских запи­сей толь­ко на осно­ве хра­ни­мых объ­ек­тов и экзем­пля­ров. Для постро­е­ния логи­че­ских струк­тур, не соот­вет­ству­ю­щих струк­ту­ре хра­ни­мо­го дере­ва, в дан­ной рабо­те пред­ла­га­ют­ся меха­низ­мы ссы­лоч­ных и вир­ту­аль­ных объ­ек­тов.

В раз­ра­бо­тан­ной моде­ли глав­ной струк­ту­рой явля­ет­ся дере­во объ­ек­тов, соот­вет­ствен­но, опе­ра­ции реля­ци­он­ной алгеб­ры, выпол­ня­ю­щи­е­ся над отно­ше­ни­я­ми, рас­про­стра­ня­ют­ся на дере­вья объ­ек­тов. Спе­ци­фи­ка­ци­он­ные опе­ра­ции, в том чис­ле опе­ра­ции про­из­ве­де­ния и соеди­не­ния, пред­ла­га­ет­ся выпол­нять в рам­ках отоб­ра­же­ния.

2. Про­из­ве­де­ние

В реля­ци­он­ной алгеб­ре опе­ра­ция про­из­ве­де­ния воз­вра­ща­ет отно­ше­ние, кор­те­жи кото­ро­го явля­ют­ся сцеп­ле­ни­ем кор­те­жей пер­во­го и вто­ро­го опе­ран­дов.

Опе­ра­цию про­из­ве­де­ния с помо­щью реля­ци­он­ной алгеб­ры мож­но запи­сать так: A TIMES B

Ссы­лоч­ные объ­ек­ты явля­ют­ся меха­низ­мом пере­струк­ту­ри­за­ции хра­ни­мо­го дере­ва, они ссы­ла­ют­ся толь­ко на экзем­пля­ры, реаль­но суще­ству­ю­щие в базе дан­ных. В общем слу­чае при опи­са­нии ссы­лоч­но­го объ­ек­та необ­хо­ди­мо задать выра­же­ние для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра отно­си­тель­но теку­ще­го экзем­пля­ра, направ­ле­ния пере­ме­ще­ния и роди­тель­ско­го экзем­пля­ра. Выра­же­ние запи­сы­ва­ет­ся на язы­ке про­грам­ми­ро­ва­ния M [10, 11].

Теку­щий экзем­пляр опре­де­ля­ет­ся пере­мен­ны­ми qqo (код теку­ще­го объ­ек­та) и qqc (код теку­ще­го экзем­пля­ра), пере­мен­ная qorder опре­де­ля­ет теку­щее направ­ле­ние пере­ме­ще­ния (-1 – к преды­ду­ще­му экзем­пля­ру, 1 – к сле­ду­ю­ще­му экзем­пля­ру, 0 – остать­ся на дан­ном экзем­пля­ре).

Рас­смот­рим реа­ли­за­цию опе­ра­ции про­из­ве­де­ния объ­ек­тов A и B с помо­щью ссы­лоч­ных объ­ек­тов (рис. 3).


Рис. 3 Про­из­ве­де­ние с помо­щью ссы­лоч­ных объ­ек­тов

Для это­го созда­ёт­ся отоб­ра­же­ние, в кото­ром объ­ект А объ­яв­ля­ет­ся хра­ни­мым, объ­ект B поме­ща­ет­ся под объ­ект А и объ­яв­ля­ет­ся ссы­лоч­ным, зада­ёт­ся выра­же­ние для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра отно­си­тель­но теку­ще­го экзем­пля­ра, име­ю­щее сле­ду­ю­щий вид:

$Select(qorder=0:qqc, 1:$$Ord(qorder, qqo, qqc, “”))

Дан­ное выра­же­ние и исполь­зу­ет реа­ли­зо­ван­ную в моде­ли функ­цию нави­га­ции по дере­ву экзем­пля­ров объ­ек­тов $$Ord для опре­де­ле­ния кода экзем­пля­ра и под­ра­зу­ме­ва­ет обход всех экзем­пля­ров объ­ек­та B.

Для опи­са­ния отоб­ра­же­ния исполь­зу­ет­ся фор­маль­ный син­так­сис Relax NG, изме­нён­ный с учё­том струк­тур­ных ком­по­нен­тов раз­ра­бо­тан­ной моде­ли. Отоб­ра­же­ние объ­яв­ля­ет­ся эле­мен­тов view. Объ­ек­ты, из кото­рых состо­ит дере­во, объ­яв­ля­ют­ся эле­мен­том оbj. Вло­жен­ность эле­мен­тов obj соот­вет­ству­ет рас­по­ло­же­нию объ­ек­тов в иерар­хии дере­ва. Поня­тия объ­яв­ля­ют­ся эле­мен­том woc. Поня­тия объ­яв­ля­ют­ся в пре­де­лах объ­яв­ле­ния объ­ек­та, кото­ро­му они при­над­ле­жат. Для рас­смот­рен­но­го при­ме­ра объ­яв­ле­ние отоб­ра­же­ния будет выгля­деть сле­ду­ю­щим обра­зом:

<view code=“pr_ref”>

<obj code=“a”>

<woc code=“sname”/>

<obj code=“b” type=“ref”>

<woc code=“pname”/>

<ref>

<expr>$Select(qorder=0:qqc, 1:$$Ord(qorder, qqo, qqc, “”))</​expr>

</​ref>

</​obj>

</​obj>

</​view>

Здесь ука­за­но, что объ­ект B в отоб­ра­же­нии име­ет тип ref (ссы­лоч­ный), кро­ме того, в эле­мен­те ref/​expr объ­ек­та зада­но выра­же­ние для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра.

В при­ме­ре для каж­до­го экзем­пля­ра объ­ек­та А в дере­во экзем­пля­ров отоб­ра­же­ния будут выво­дить­ся все экзем­пля­ры объ­ек­та B, то есть будет реа­ли­зо­ва­на опе­ра­ция про­из­ве­де­ния.

Опе­ра­цию про­из­ве­де­ния с исполь­зо­ва­ни­ем ссы­лоч­ных объ­ек­тов мож­но опи­сать сле­ду­ю­щим выра­же­ни­ем XQuery:

let $base := doc(“base.xml”)

for $a in $base/​/​a

return

<a>

{$a/(*|@*)}

{

for $b in $base/​/​b

return {$b}

}

</​a>

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

Для дан­но­го при­ме­ра, если в спис­ке пере­хо­дов ука­зать код объ­ек­та B, то для каж­до­го экзем­пля­ра объ­ек­та А будут выво­дить­ся все экзем­пля­ры объ­ек­та B.

<view code=“pr_ref”>

<obj code=“a”>

<woc code=“sname”/>

<obj code=“b” type=“ref”>

<woc code=“pname”/>

<ref ref=“b”/>

</​obj>

</​obj>

</​view>

Здесь в эле­мен­те ref объ­ек­та B задан спи­сок пере­хо­дов – код объ­ек­та B.

Так как ссы­лоч­ные объ­ек­ты ссы­ла­ют­ся на хра­ни­мые экзем­пля­ры, для них допу­сти­мы опе­ра­ции кор­рек­ции зна­че­ний, созда­ния и уда­ле­ния экзем­пля­ров.

Вир­ту­аль­ные объ­ек­ты явля­ют­ся меха­низ­мом постро­е­ния вир­ту­аль­ных дере­вьев объ­ек­тов. Вир­ту­аль­ные объ­ек­ты исполь­зу­ют­ся для пред­став­ле­ния дан­ных как суще­ству­ю­щих, так и не суще­ству­ю­щих в базе дан­ных. В отли­чие от ссы­лоч­ных объ­ек­тов пове­де­ние вир­ту­аль­ных объ­ек­тов пол­но­стью опре­де­ля­ет­ся поль­зо­ва­те­лем.

Для вир­ту­аль­но­го объ­ек­та поль­зо­ва­те­лю необ­хо­ди­мо опре­де­лить опе­ра­цию для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра отно­си­тель­но теку­ще­го экзем­пля­ра, направ­ле­ния пере­ме­ще­ния и роди­тель­ско­го экзем­пля­ра. Опе­ра­ция так­же долж­на воз­вра­щать зна­че­ния поня­тий для полу­чен­но­го экзем­пля­ра. Опе­ра­ция реа­ли­зу­ет­ся на язы­ке про­грам­ми­ро­ва­ния M [10, 11].

Опе­ра­ция име­ет сле­ду­ю­щий вид:

СodeRes = $$gOrder(Order, Obj, Code, Сode0,.Values)

Пара­мет­ры опе­ра­ции:

Order – направ­ле­ние пере­ме­ще­ния по экзем­пля­рам (-1, 1, 0);

Obj – код вир­ту­аль­но­го объ­ек­та;

Code – теку­щий код экзем­пля­ра вир­ту­аль­но­го объ­ек­та;

Code0 – код экзем­пля­ра объ­ек­та-роди­те­ля.

Зна­че­ние, воз­вра­ща­е­мое опе­ра­ци­ей:

CodeRes – следующий/​предыдущий код экзем­пля­ра вир­ту­аль­но­го объ­ек­та отно­си­тель­но направ­ле­ния пере­ме­ще­ния, теку­ще­го кода экзем­пля­ра и теку­ще­го кода экзем­пля­ра объ­ек­та-роди­те­ля. Если опе­ра­ция воз­вра­ща­ет “”, то про­ис­хо­дит пере­ход к сле­ду­ю­ще­му коду экзем­пля­ра объ­ек­та-роди­те­ля.

Все зна­че­ния поня­тий долж­ны быть запи­са­ны в мас­сив сле­ду­ю­ще­го вида:

Values(Woc)=Value

Здесь:

Woc – код поня­тия;

Value – зна­че­ние поня­тия.

Код экзем­пля­ра вир­ту­аль­но­го объ­ек­та может быть сфор­ми­ро­ван любым обра­зом, удоб­ным для поль­зо­ва­те­ля.

Рас­смот­рим реа­ли­за­цию опе­ра­ции про­из­ве­де­ния для объ­ек­тов А и В с исполь­зо­ва­ни­ем вир­ту­аль­но­го объ­ек­та (рис. 4).


Рис. 4. Про­из­ве­де­ние с помо­щью вир­ту­аль­ных объ­ек­тов

Для это­го созда­ёт­ся объ­ект АВ и отоб­ра­же­ние, в кото­ром объ­ект АB объ­яв­ля­ет­ся вир­ту­аль­ным. Далее для объ­ек­та АВ зада­ёт­ся опе­ра­ция gOrder для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра и зна­че­ний поня­тий экзем­пля­ра (рис. 5) и запи­сы­ва­ет­ся вызов этой опе­ра­ции в свой­ствах объ­ек­та.

<view code=“pr_virt”>

<obj code=“ab” type=“virt”>

<woc code=“sname”/>

<woc code=“pname”/>

<ref>

<expr>$$gOrder(qorder, qqo, qqc, “”, .values)</expr>

</​ref>

</​obj>

</​view>

Здесь ука­за­но, что объ­ект B в отоб­ра­же­нии име­ет тип virt (вир­ту­аль­ный), кро­ме того, в эле­мен­те ref/​expr объ­ек­та задан вызов опе­ра­ции для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ров и зна­че­ний поня­тий.

Для дан­но­го при­ме­ра опе­ра­ция gOrder будет иметь сле­ду­ю­щий вид:

gOrder(order, obj, code, code0, .Values)

{

kill Values(“SName”), Values(“PName”)

new codeA, codeB

set codeA = $extract(code, 1, 2)

set codeB = $extract(code, 3, 4)

if order ‘= 0 {

set codeB = $$Ord(order, “B”, codeB, “”)

if codeB = “” {

set codeA = $$Ord(order, “A”, codeA, “”)

if codeA’=”” set codeB = $$Ord(order, “B”, codeB,“”)

}

else if codeA = “” set codeA = $$Ord(order, “A”, codeA,“”)

}

if codeA ‘= “”, codeB ‘= “” {

set Values(“SName”) = $$Get(“A”, “SName”, codeA)

set Values(“PName”) = $$Get(“B”, “PName”, codeB)

}

quit codeA_​codeB

}

Рис. 5. Опе­ра­ция полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра и зна­че­ний поня­тий

Опе­ра­ция gOrder воз­вра­ща­ет коды экзем­пля­ров, кото­рые явля­ют­ся сцеп­ле­ни­ем кодов экзем­пля­ров объ­ек­тов А и В, пер­вые два сим­во­ла кода экзем­пля­ра опре­де­ля­ют­ся кодом экзем­пля­ра объ­ек­та А, послед­ние два сим­во­ла – кодом экзем­пля­ра объ­ек­та В. Зна­че­ния поня­тий берут­ся из соот­вет­ству­ю­щих экзем­пля­ров объ­ек­тов-опе­ран­дов. Таким обра­зом, опе­ра­ция gOrder моде­ли­ру­ет опе­ра­цию про­из­ве­де­ния.

Опе­ра­цию про­из­ве­де­ния с исполь­зо­ва­ни­ем вир­ту­аль­ных объ­ек­тов мож­но опи­сать сле­ду­ю­щим выра­же­ни­ем XQuery:

let $base := doc(“base.xml”)

for $a in $base/​/​a

for $b in $base/​/​b

return

<ab code=”{concat($a/@code, $b/@code)}”>

{ $a/(*|@*[name() != “code”]) }

{ $b/(*|@*[name() != “code”]) }

</​ab>

Так как экзем­пля­ры вир­ту­аль­ных объ­ек­тов не явля­ют­ся хра­ни­мы­ми, для них запре­ще­ны опе­ра­ции созда­ния экзем­пля­ров, кор­рек­ции зна­че­ний и уда­ле­ния экзем­пля­ров. Одна­ко эти опе­ра­ции могут быть реа­ли­зо­ва­ны поль­зо­ва­те­лем в триг­гер­ном дей­ствии вме­сто опе­ра­ции.

Поды­то­жим ска­зан­ное о ссы­лоч­ных и вир­ту­аль­ных объ­ек­тах. Ссы­лоч­ные объ­ек­ты ссы­ла­ют­ся на объ­ек­ты, реаль­но суще­ству­ю­щие в базе дан­ных, для них опе­ра­ции мани­пу­ли­ро­ва­ния под­дер­жи­ва­ют­ся систе­мой. Экзем­пля­ры вир­ту­аль­ных объ­ек­тов не суще­ству­ют в базе, а созда­ют­ся поль­зо­ва­те­лем, соот­вет­ствен­но, опе­ра­ции мани­пу­ли­ро­ва­ния вир­ту­аль­ным объ­ек­том так­же долж­ны опре­де­лять­ся поль­зо­ва­те­лем.

Так как код экзем­пля­ра ссы­лоч­но­го объ­ек­та есть код экзем­пля­ра хра­ни­мо­го объ­ек­та, то к тако­му ссы­лоч­но­му объ­ек­ту мож­но достра­и­вать потом­ков это­го хра­ни­мо­го объ­ек­та. Для того что­бы достро­ить потом­ков к вир­ту­аль­но­му объ­ек­ту необ­хо­ди­мо исполь­зо­вать ссы­лоч­ные объ­ек­ты и зада­вать для них опе­ра­цию полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра.

Соеди­не­ние

В реля­ци­он­ной алгеб­ре опе­ра­ция соеди­не­ния (Q‑соединения) воз­вра­ща­ет отно­ше­ние, кор­те­жи кото­ро­го явля­ют­ся сцеп­ле­ни­ем кор­те­жей пер­во­го и вто­ро­го отно­ше­ний и удо­вле­тво­ря­ют неко­то­ро­му усло­вию.

Эта опе­ра­ция может быть опре­де­ле­на на осно­ве опе­ра­ции про­из­ве­де­ния и выбор­ки сле­ду­ю­щим обра­зом:

A TIMES B WHERE X Q Y, где

А, В – дере­вья экзем­пля­ров;

X – поня­тие объ­ек­та А;

Y – поня­тие объ­ек­та B;

Q – опе­ра­тор срав­не­ния.

В пред­ла­га­е­мой моде­ли опе­ра­ция про­из­ве­де­ния может быть реа­ли­зо­ва­на с исполь­зо­ва­ни­ем ссы­лоч­ных или вир­ту­аль­ных объ­ек­тов. Усло­вие может быть зада­но для каж­до­го объ­ек­та в дере­ве объ­ек­тов либо в выра­же­нии для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра (для ссы­лоч­но­го объ­ек­та) или в опе­ра­ции gOrder (для вир­ту­аль­но­го объ­ек­та).

В реля­ци­он­ной алгеб­ре если опе­ра­тор Q явля­ет­ся опе­ра­то­ром равен­ства «=», то такое соеди­не­ние назы­ва­ет­ся рав­но-соеди­не­ни­ем. Резуль­ти­ру­ю­щее отно­ше­ние будет вклю­чать два атри­бу­та, зна­че­ния кото­рых в каж­дом кар­те­же рав­ны. Если исклю­чить один из этих атри­бу­тов, то такое соеди­не­ние будет назы­вать­ся есте­ствен­ным. Фор­маль­но эту опе­ра­цию мож­но запи­сать сле­ду­ю­щим обра­зом:

A JOIN B º A TIMES B WHERE X = Y {ALL BUT X}

В пред­ла­га­е­мой моде­ли пере­чень поня­тий каж­до­го объ­ек­та зада­ёт­ся в дере­ва объ­ек­тов отоб­ра­же­ния, кро­ме того, опе­ра­ция про­ек­ции может осу­ществ­лять­ся в рам­ках отоб­ра­же­ния.

Для упро­ще­ния запи­си опе­ра­ции рав­но-соеди­не­ния или есте­ствен­но­го соеди­не­ния с помо­щью ссы­лоч­ных объ­ек­тов в пред­ла­га­е­мой моде­ли вво­дит­ся спи­сок пере­хо­дов. Спи­сок пере­хо­дов – это спи­сок объ­ек­тов, для кото­рых теку­щий объ­ект исполь­зу­ет­ся как ссы­лоч­ный. Связь уста­нав­ли­ва­ет­ся через рав­ные зна­че­ния поня­тий теку­ще­го объ­ек­та и объ­ек­тов спис­ка. На осно­ва­нии спис­ка пере­хо­дов авто­ма­ти­че­ски стро­ит­ся выра­же­ние для полу­че­ния сле­ду­ю­ще­го кода экзем­пля­ра.

С помо­щью син­так­си­са XML спи­сок пере­хо­дов мож­но опре­де­лить сле­ду­ю­щим обра­зом:

<obj code=“Obj” type=“ref”>

<ref ref=“Obj1”>

<woc code=“Woc011” ref=“Woc11”/>

<woc code=“Woc01m” ref=“Woc1m”/>

</​ref>

<ref ref=“Objn”>

<woc code=“Woc0n1” ref=“Wocn1”/>

<woc code=“Woc0nk” ref=“Wocnk”/>

</​ref>

</​obj>

Здесь:

Obji – код объ­ек­та, для кото­ро­го теку­щий объ­ект может быть ссы­лоч­ным;

Woc0ij – поня­тие теку­ще­го объ­ек­та, по зна­че­ни­ям кото­ро­го осу­ществ­ля­ет­ся связь;

Wocij – соот­вет­ству­ю­щее поня­тие объ­ек­та Obji, по зна­че­ни­ям кото­ро­го осу­ществ­ля­ет­ся связь.

Если код поня­тия теку­ще­го объ­ек­та и объ­ек­та Obji сов­па­да­ет, то код поня­тия объ­ек­та Obji может быть опу­щен.

Если А – мно­же­ство экзем­пля­ров теку­ще­го объ­ек­та, то спи­сок пере­хо­дов может быть опи­сан сле­ду­ю­щим выра­же­ни­ем реля­ци­он­ной алгеб­ры:

A REF Obji = (Obji TIMES A WHERE Woc0i1=Woci1 AND … AND Woc0im=Wocim) {ALL BUT Obji}

Тогда опе­ра­ция соеди­не­ния опре­де­ля­ет­ся на осно­ва­нии спис­ка пере­хо­дов и опе­ра­ции про­из­ве­де­ния:

Obji JOIN A = Obji TIMES (A REF Obji)

Рас­смот­рим при­мер, пусть име­ют­ся объ­ек­ты А и В, в кото­рых поль­зо­ва­тель­ски­ми потен­ци­аль­ны­ми клю­ча­ми явля­ют­ся поня­тия S и P соот­вет­ствен­но, и объ­ект АВ, кото­рый в реля­ци­он­ном смыс­ле явля­ет­ся ассо­ци­а­ци­ей объ­ек­тов А и В. Объ­ект АВ содер­жит поль­зо­ва­тель­ские внеш­ние клю­чи – S и P, ссы­ла­ю­щи­е­ся на соот­вет­ству­ю­щие поня­тия объ­ек­тов А и В. То есть, меж­ду объ­ек­том А и объ­ек­том АB, а так­же меж­ду объ­ек­том B и объ­ек­том АВ реа­ли­зо­ва­ны гори­зон­таль­ные свя­зи (рис. 6).


Рис. 6. Соеди­не­ние с помо­щью ссы­лоч­ных объ­ек­тов

Для реа­ли­за­ции опе­ра­ции соеди­не­ния в отоб­ра­же­нии объ­ект АВ объ­яв­ля­ет­ся хра­ни­мым, объ­ек­ты А и B поме­ща­ют­ся под объ­ект АВ как дочер­ние и объ­яв­ля­ют­ся ссы­лоч­ны­ми. Для объ­ек­та А зада­ёт­ся спи­сок пере­хо­дов AB:S, для объ­ек­та B – спи­сок пере­хо­дов AB:P, соот­вет­ствен­но, реа­ли­зу­ют­ся опе­ра­ции соеди­не­ния AB JOIN A и AB JOIN B.

<view code=“join_ref”>

<obj code=“ab”>

<woc code=“s”/>

<woc code=“p”/>

<obj code=“a” type=“ref”>

<woc code=“s”/>

<ref ref=“ab”>

<woc code=“s”/>

</​ref>

</​obj>

<obj code=“b” type=“ref”>

<woc code=“p”/>

<ref ref=“ab”>

<woc code=“p”/>

</​ref>

</​obj>

</​obj>

</​view>

Здесь ука­за­но, что объ­ек­ты A и B в отоб­ра­же­нии име­ет тип ref (ссы­лоч­ный), кро­ме того, с помо­щью эле­мен­та ref зада­ны спис­ки пере­хо­дов для объ­ек­тов.

Опе­ра­цию соеди­не­ния с исполь­зо­ва­ни­ем ссы­лоч­ных объ­ек­тов мож­но опи­сать сле­ду­ю­щим выра­же­ни­ем XQuery:

let $base := doc(“base.xml”)

for $ab in $base/​/​ab

return

<ab>

{$ab/(*|@*)}

{

for $a in $base/​/​a

where $ab/@s = $a/@s

return $a

}

{

for $b in $base/​/​b

where $ab/@p = $b/@p

return $b

}

</​ab>

Таким обра­зом, с помо­щью ссы­лоч­ных объ­ек­тов гори­зон­таль­ные свя­зи пред­став­ля­ют­ся как логи­че­ские иерар­хи­че­ские свя­зи. Оче­вид­но, такое пред­став­ле­ние явля­ет­ся более нагляд­ным и инту­и­тив­но понят­ным для поль­зо­ва­те­ля.

Соб­ствен­но иерар­хи­че­ские свя­зи по кодам экзем­пля­ров в пред­ла­га­е­мой моде­ли так­же пред­став­ля­ют собой реа­ли­за­цию опе­ра­ций соеди­не­ния меж­ду экзем­пля­ра­ми роди­тель­ско­го объ­ек­та (A) и экзем­пля­ра­ми дочер­не­го объ­ек­та (B) (рис. 7): A JOIN B.


Рис. 7. Реа­ли­за­ция иерар­хи­че­ских свя­зей

Такие опе­ра­ции выпол­ня­ют­ся систе­мой авто­ма­ти­че­ски на осно­ва­нии струк­ту­ры отоб­ра­же­ния

<view code=“tree”>

<obj code=“a”>

<obj code=“b”/>

</​obj>

</​view>

и могут быть опи­са­ны с помо­щью сле­ду­ю­ще­го выра­же­ния XQuery:

let $base := doc(“base.xml”)

for $a in $base/​/​a

return

<a>

{$a/(*|@*)}

{

for $b in $base/​/​b

where substring($b/@code, 1, $len) = $a/@code

return $b

}

</​a>

Здесь $len – дли­на кода экзем­пля­ра объ­ек­та A, функ­ция substring выде­ля­ет из кода экзем­пля­ра объ­ек­та B зна­че­ние внеш­не­го клю­ча, ссы­ла­ю­ще­го­ся на код экзем­пля­ра объ­ек­та А.

С помо­щью ссы­лоч­ных объ­ек­тов так­же пред­ла­га­ет­ся решать зада­чу инвер­ти­ро­ва­ния иерар­хии по кодам экзем­пля­ров. В каче­стве спис­ка пере­хо­дов для ссы­лоч­ных объ­ек­тов может быть ука­зан код объ­ек­та-пред­ка для дан­но­го объ­ек­та. В этом слу­чае связь осу­ществ­ля­ет­ся по кодам экзем­пля­ров, и в дере­во экзем­пля­ров попа­дут те экзем­пля­ры объ­ек­та, кото­рые явля­ют­ся потом­ка­ми для экзем­пля­ра объ­ек­та-пред­ка. Код экзем­пля­ра объ­ек­та-пред­ка опре­де­ля­ет­ся по роди­тель­ско­му для ссы­лоч­но­го объ­ек­та объ­ек­ту в отоб­ра­же­нии. Если в отоб­ра­же­нии нет роди­тель­ско­го объ­ек­та для ссы­лоч­но­го или этот роди­тель­ский объ­ект в отоб­ра­же­нии не вхо­дит в под­схе­му базы дан­ных, вклю­ча­ю­щую ссы­лоч­ный объ­ект, то в дере­во экзем­пля­ров попа­дут все экзем­пля­ры ссы­лоч­но­го объ­ек­та. Если в каче­стве кода объ­ек­та-пред­ка ука­зан код само­го ссы­лоч­но­го объ­ек­та, то в дере­во экзем­пля­ров попа­дёт толь­ко один экзем­пляр для каж­до­го экзем­пля­ра объ­ек­та-пред­ка.

Допол­ним преды­ду­щий при­мер объ­ек­том С, дочер­ним для объ­ек­та В, и рас­смот­рим два вари­ан­та инвер­ти­ро­ва­ния иерар­хии (рис. 8).


Рис. 8. Инвер­ти­ро­ва­ние иерар­хии

В обо­их слу­ча­ях в отоб­ра­же­ние поме­ща­ет­ся объ­ект С как хра­ни­мый, под него поме­ща­ет­ся объ­ект B, кото­рый объ­яв­ля­ет­ся ссы­лоч­ным. В спис­ке пере­хо­дов в пер­вом слу­чае ука­зы­ва­ет­ся объ­ект А, во вто­ром – объ­ект В.

<view code=“invert1”>

<obj code=“c”>

<obj code=“b” type=“ref”>

<ref ref=“a”/>

</​obj>

</​obj>

</​view>

<view code=“invert2”>

<obj code=“c”>

<obj code=“b” type=“ref”>

<ref ref=“b”/>

</​obj>

</​obj>

</​view>

Для пер­во­го слу­чая код экзем­пля­ра объ­ек­та А (объ­ект-пре­док) содер­жит­ся в коде экзем­пля­ра объ­ек­та С (роди­тель­ский объ­ект в отоб­ра­же­нии), в дан­ном слу­чае это код равен А. Соот­вет­ствен­но, в дере­во экзем­пля­ров попа­дут дочер­ние для А:A экзем­пля­ры объ­ек­та В – AА и АВ.

Для вто­ро­го слу­чая код экзем­пля­ра объ­ек­та В (объ­ект-пре­док) содер­жит­ся в коде экзем­пля­ра объ­ек­та С (роди­тель­ский объ­ект в отоб­ра­же­нии), в дан­ном слу­чае это коды АА и АВ. Соот­вет­ствен­но, в дере­во экзем­пля­ров попа­дут «дочер­ний» для B:АА экзем­пляр объ­ек­та В, то есть, сам экзем­пляр AА, а так­же «дочер­ний» для B:АB экзем­пляр объ­ек­та В – AB.

Таким обра­зом, в пер­вом слу­чае фак­ти­че­ски реа­ли­зу­ет­ся опе­ра­ция:

C JOIN A JOIN B {ALL BUT A},

а во вто­ром слу­чае опе­ра­ция:

C JOIN B JOIN B {ALL BUT B} º C JOIN B

С исполь­зо­ва­ние XQuery эти опе­ра­ции могут быть опи­са­ны сле­ду­ю­щим обра­зом.

Для пер­во­го слу­чая:

let $base := doc(“base.xml”)

for $c in $base/​/​c

return

<c>

{$c/(*|@*)}

{

for $a in $base/​/​a

for $b in $base/​/​b

where $a/@code = substring($c/@code, 1, $len_​a) and

substring($b/@code, 1, $len_​a) = $a/@code

return $b

}

</​c>

Для вто­ро­го слу­чая:

let $base := doc(“base.xml”)

for $c in $base/​/​c

return

<c>

{$c/(*|@*)}

{

for $b in $base/​/​b

where $b/@code = substring($c/@code, 1, $len_​b)

return $b

}

</​c>

4. Заклю­че­ние

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

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

Пред­ло­жен­ная модель дан­ных явля­ет­ся осно­вой раз­ра­бо­тан­но­го инстру­мен­та для постро­е­ния и исполь­зо­ва­ния инфор­ма­ци­он­ных систем qWORD-XML [10]. Бла­го­да­ря реа­ли­зо­ван­ной моде­ли дан­ных, а так­же уни­фи­ка­ции хра­не­ния, обра­бот­ки и пред­став­ле­ния дан­ных, инстру­мент qWORD-XML пред­став­ля­ет собой удоб­ную сре­ду для быст­рой и про­стой раз­ра­бот­ки, про­сто­го сопро­вож­де­ния и исполь­зо­ва­ния инфор­ма­ци­он­ных систем.

С помо­щью инстру­мен­та qWORD-XML были раз­ра­бо­та­ны Авто­ма­ти­зи­ро­ван­ная инфор­ма­ци­он­но-ана­ли­ти­че­ская систе­ма по про­бле­мам инва­лид­но­сти и инва­ли­дов (АИС МСЭ) и Инфор­ма­ци­он­но-ана­ли­ти­че­ская систе­ма орга­нов соци­аль­ной защи­ты насе­ле­ния субъ­ек­та феде­ра­ции (АИС «Соц­за­щи­та»).

Лите­ра­ту­ра

  1. Тимо­фе­ев Д.В. Исполь­зо­ва­ние плат­фор­мы XML для опи­са­ния рас­ши­рен­ной реля­ци­он­ной моде­ли дан­ных RM/​T
  2. Кодд Э.Ф. Рас­ши­ре­ние реля­ци­он­ной моде­ли для луч­ше­го отра­же­ния семан­ти­ки. http://www.osp.ru/dbms/1996/05/163.htm
  3. Extensible Markup Language (XML) 1.0. http://www.w3.org/TR/REC-xml/
  4. Relax NG. http://relaxng.org/
  5. The Schematron. http://xml.ascc.net/resource/schematron/
  6. Document Object Model (DOM). http://www.w3.org/DOM/
  7. XML Path Language (XPath) Version 1.0. http://www.w3.org/TR/xpath
  8. XML Path Language (XPath) 2.0. http://www.w3.org/TR/xpath20/
  9. XQuery 1.0: An XML Query Language. http://www.w3.org/TR/xquery/
  10. Гес­се С., Кир­стен В. Вве­де­ние в язык про­грам­ми­ро­ва­ния М. – СПб: АОЗТ «СП. АРМ», 1996 – 280с.
  11. Кир­стен В. От ANS MUMPS к ISO M. – СПб: СП.АРМ, 1995 – 277с.
  12. Дол­жен­ков А., Тимо­фе­ев Д. Семан­ти­че­ский инстру­мент постро­е­ния баз дан­ных. «Откры­тые систе­мы», №01/​2006